iBooksのSwift本を読んでいて、convenience initializer
というのを見つけました。
また対比として、designated initializer
という単語が出てきます。
要は指定イニシャライザです。
ちょっと文章とか曖昧なので、違ったら突っ込んでもらいたいんですが、convenience initializer
は他のイニシャライザに処理を委譲(delegate)することができます。
つまりイニシャライザの中で別のイニシャライザを呼ぶことが出来ます。
class SomeClass {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "default name")
}
}
var aClass: SomeClass = SomeClass() // => "name: default name"
convenience
の名前通り、デフォルトの処理があって、基本はそれに任せつつ、必要があれば引数を取って特別に処理をする、みたいなことを想定しているのでしょうか。
Super classを含めたイニシャライザ
上の例だけならなるほど、で終わりだったんですが、継承を含めるとさらに複雑になります。
サブクラスのイニシャライザ内で、Super classで定義された変数にアクセスする場合は、まず最初にsuper.init
を呼ばないとなりません。(Super classのイニシャライザを呼んでからならアクセスできる)
さらにこのsuper.init
を呼ぶ際、designated initializer
を呼び出す必要があります。
(つまり、convenience initializer
は呼べない)
class SubClass: SomeClass2 {
var hoge: String
init() {
self.hoge = "foo" // Sub classで定義されている変数には`super.init`前にアクセス可能
super.init(name: "hogehoge") // Super classのdesignated initializerは`init(name:)`
self.name = "name" // Super classのinitializerを呼んだ後ならアクセスできる
}
}
class SubClass: SomeClass2 {
init() {
self.name = "name" // `super.init`前に、Super classの変数にはアクセスできない
super.init() // `convenience initializer`はSub classから直接呼べない
}
}