Swiftで一度だけ実行したい時に使えるファンクション

swift programming

viewDidLayoutSubviewsなど何度も呼び出されてしまうファンクション内で一度だけ実行したい処理があった場合に以下のような書き方をしていた。

これだと毎回フラグを宣言、条件分岐するのは面倒だし、可読性がよくないなと思っていた。

var isFirst = false

override func viewDidLayoutSubviews() { // updateLayout
  if !isFirst {
     isFirst = true

    // 一度だけ実行したい処理を書く
  }  
}

クロージャーとlazyを使ったスマートな書き方を見つけた。

参考: https://qiita.com/codelynx/items/f0243d631f2448e89026

private lazy var onceUpdateLayout: (()->())? = {
  // 一度だけ実行したい処理を書く
    return nil
}()

override func viewDidLayoutSubviews() { // updateLayout
  onceUpdateLayout?()
}

処理をファンクションに分離できたため何をしているのかがわかり可読性が上がった。

他にも色々な書き方がいろいろあるようだ。

クロージャー(Closures)は名前のない関数で変数として扱われる。 lazy(lazy stored property)は、参照されるときに初めて初期値が設定されるプロパティ。