[Swift] viewDidLayoutSubviewsで初回だけ処理をしたい

問題

[iOS] AutoLayout使用時の注意点
AutoLayout使用時、view.frameはViewWillLayoutSubViews以降で取得する

AutoLayoutを使用した場合、Frameが決定されるのがviewWillAppear後のため、
初期化処理をviewDidLayoutSubviewsに記載する必要がある。

しかし、viewDidLayoutSubviewsは何度も呼ばれるメソッドのため、
普通に書くと何度も呼ばれてしまう。

対処法

lazyを使う。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    _ = self.initViewLayout
}

private lazy var initViewLayout : Void = {
    print(self.view.frame)
}() 

呼び出し時に初めて初期値がセットされるlazyを利用して初期化する。
(サンプルコード見てて、こういう記法があることを初めて知った笑)

こう書くことで、viewDidLayoutSubViewsにてinitViewLayoutという変数が呼ばれ、
初回呼び出し時に定義されるため、 {} で記述した中身が実行される。

初回以降の呼び出しでは中身が定義されずVoidを返すだけになる。(で、あってるかな…。)

参考

PageControl/ViewController.swift
Demonstrates how to use a