hiragram no blog

iOSとか

Swiftのイニシャライザややこしかったのでまとめた

  • 既定イニシャライザ(default initializer)
    • 引数なし。
    • イニシャライザが1つも定義されておらず、すべてのプロパティの初期値が設定されている時に利用可能になる。
    • ベースクラスの既定イニシャライザは指定イニシャライザとして機能する。
  • 指定イニシャライザ(designated initializer)
    • そのイニシャライザを使うだけでインスタンスの初期化が全て完了できるようなイニシャライザ。
    • サブクラスにおいては、直接のスーパークラスの指定イニシャライザのみ使える。
    • どのサブクラスも、指定イニシャライザを必ず1つ備えている必要がある。
  • 簡易イニシャライザ(convenience initializer)
    • 他のイニシャライザを呼び出して初期化を行うイニシャライザ。
    • 同じクラスの他のイニシャライザを呼び出して利用するが、直接あるいは間接的に指定イニシャライザを呼び出していなければならない。
    • convenienceキーワードがつく

あるクラスの簡易イニシャライザを呼ぶと、スーパークラスのイニシャライザを順番に呼んでいき、ベースクラスの指定イニシャライザが実行された後に自分のクラスのプロパティに値を入れられるようになる。

指定イニシャライザは、スーパークラスのイニシャライザを叩く前に、そのクラスで追加された変数、定数の初期化を済ませていなければならない。

サブクラスのイニシャライザは、スーパークラスのイニシャライザを呼ぶ前に、スーパークラスのプロパティにアクセス出来ない。

イニシャライザは、ベースクラスの変数、定数の初期化が終わるまでインスタンスメソッドやプロパティにアクセスしたり、selfを値として扱ってはいけない。そういう時はタイプメソッドにしましょう。