全3回で説明してます。その3回目です。
[Swift] 脱初心者 class initializer おさらい(1: designated initializer と convenience initializer)
[Swift] 脱初心者 class initializer おさらい(2: クラス継承と required initializer)
Sponsor Link
initializer からのエラー
ここまで説明してきた initializer は、何らかのオブジェクトを生成することが前提でした。
しかし、場合によっては、オブジェクトを生成したくない/できないときもあるかもしれません。
そのようなケース向けに、nil を返すことができる initializer を定義することができます。
“failable initializer” と呼ばれます。 failable = “fail”(失敗) + “able”(できる)という命名になっている通り、失敗するかもしれない initializer です。
failable initializer
Initializer は、init( ) という名称を持つ必要があり、返り値は設定できません。ですので、failable initializer は、すこし特殊な定義方法となります。
class Example {
var a:Int
init?() {
return nil // always fail initializer
}
}
定義としては、init? という名前の関数を定義することになります。意味的には、”init() -> Example?” 的な意味です。
このように定義することで、nil を返すことが可能です。
上記の例は、常に nil を返す initializer になっています。通常は、条件判定によって、返すことになります。
通常の initialize で nil を返せないかやってみます。
class Example {
var a:Int
init() {
return nil // error : Only a failable initializer can return 'nil'
}
}
このように、failable initializer でないと、nil を返せず、コンパイルエラーとなります。
designated initializer/ convenience initializer との関係
failable initializer は、designated initializer になれる?
なれます。例えば、以下のケースでは、1つの failable initailizer を designated initializer として定義しています。
class Example {
var a:Int
init?(_ value: Int) {
if value == 3 {
return nil // 設定値として3を渡されたら失敗
}
a = value
}
}
failable initializer は、convenience initializer になれる?
なれます。以下のケースでは、1つの failable initalizer を convenience initializer として定義しています。
初期化が必要な property がありますので、別途 designated initializer は必要となります。
class Example {
var a:Int
init(_ value:Int) { // designated initializer
a = value
}
convenience init?(_ value: Int, coeff:Int) { // convenience failable initializer
if coeff == 1 {
return nil
}
self.init(value * coeff)
}
}
まとめ:initializer の種類まとめ
class initializer は、何種類かありますが、適材適所に使うことで、コードがレベルアップします。
- default initializer
- property が自動的に決められるときに、自動的に作成される
- designated initializer
- 必ず呼ばれなければいけない、全ての property を初期化する initializer
- convenience initializer
- 初期化方法を複数提供するための initializer、designated initializer を呼ばなければいけない
- required initializer
- 継承した子クラスから override されなければいけないことを指定された initializer
- failable initializer
- オブジェクト生成でエラーが発生するかもしれない initializer
個別の項目をきちんと理解することも大切ですが、全体を俯瞰して理解することも大事です。俯瞰した理解には、以下のような書籍を使うのが近道です。
Swift 学習におすすめの本
詳解Swift
Swift の学習には、詳解 Swift という書籍が、おすすめです。
著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。
最新版を購入するのがおすすめです。
現時点では、上記の Swift 5 に対応した第5版が最新版です。
Swift ポケットリファレンス
Swift を学んでも、プログラミング言語の文法を全て記憶しておくことは無理なので、ちょっとした文法の確認をするために、リファレンス本を手元に置いておくと便利です。
Swift4 までしか対応していないので、理解して参照する必要があります。
説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。
Sponsor Link