Initialization
訳はてきとう
前回に引き続き https://docs.swift.org/swift-book/LanguageGuide/Initialization.html を読む。
- 格納型プロパティは、初期化子のなかで値を設定するか、プロパティの宣言に初期値を書く
- 初期化子の中で値を設定するか、初期値を宣言したときは、プロパティオブザーバは呼び出されない
- プロパティがいつも同じ初期値をとるなら、初期化子内で設定するよりも初期値を与えよ
- クラスの格納型プロパティにすべて初期値があればデフォルト初期化子がある
- 構造体には全項目初期化子がある
- 初期化子の委譲は
self.init
- 指定初期化子と便利初期化子
- クラスの指定初期化子は、少ない傾向。ひとつしか持たないことがよくある
- どのクラスも1つは指定初期化子を持たなければならない
- 便利初期化子
convenience
修飾子をinit
キーワードの前につけて - 委譲のルール
- 指定初期化子は、スーパークラスの指定初期化子を呼び出さなければならない
- 便利初期化子は、同じクラスの他の初期化子を呼び出さなければならない
- 便利初期化子は、最終的には指定初期化子を呼び出さなければならない
- 単純版
- 指定初期化子は上へ委譲する
- 便利初期化子は横へ委譲する
- Swiftでは、クラスの初期化は2段階
- 2段階初期化プロセスを使用すると、クラス階層内の各クラスに完全な柔軟性を与えながら、初期化を安全に行うことができる
- 2段階初期化は、プロパティ値が初期化される前にアクセスされるのを防ぎ、予期せず別の初期化子によってプロパティ値が別の値に設定されるのを防ぐ
- 安全性検査
- 2つの段階
- 第1段階
- 第2段階
- 継承チェインの先頭から戻りながら、指定初期化子にはさらにカスタマイズする選択肢がある
- 初期化子は、この段階では、
self
にアクセスしたりプロパティ値を変更したり、メソッドを呼んだりできる - 最後に、便利初期化子にはカスタマイズする選択肢がある
- Objective-Cのサブクラスとは異なり、Swiftサブクラスはデフォルトでスーパークラス初期化子を継承しない
- 自動的に継承される初期化子。サブクラスで提供するプロパティにすべて初期値が宣言されているとして、
- 失敗可能初期化子
init?
- 失敗時は
nil
をreturn
するけど、成功時はとくになにもreturn
しないよ - 同じ名前と型のパラメータで失敗可能・失敗不能初期化子を両方定義することはできない
rawValue
のあるenum
は自動的にinit?(rawValue:)
を収容している- 失敗可能を失敗不能にオーバーライドできるけど、逆は無理
- 初期化中に強制アンラップしている失敗可能な初期化子は
init!
- サブクラスで実装しなければならない初期化子は
required init()
- クロージャでプロパティの初期化
let someProperty: SomeType = { return someValue }()
やたら量が多いので、他の章の5倍はあるけど、内容はまあ、ゾッともゲッともしない。ああそうだね、という感じ。 スーパークラスの初期化が終わってないのにスーパークラスのメソッドが呼び出せたりするような危険な状況を回避するために、 厳格で単純なルールを作っている、…と思った(夏休みの感想)。