初始化方法永遠(yuǎn)遵循以下兩個(gè)原則:
1.初始化路徑必須保證對(duì)象完全初始化,這可以通過調(diào)用本類型的 designated 初始化方法來得到保證;
2.子類的 designated 初始化方法必須調(diào)用父類的 designated 方法,以保證父類也完成初始化。
對(duì)于某些我們希望子類中一定實(shí)現(xiàn)的 designated 初始化方法,我們可以通過添加 required 關(guān)鍵字進(jìn)行限制,強(qiáng)制子類對(duì)這個(gè)方法重寫實(shí)現(xiàn)。這樣做的最大的好處是可以保證依賴于某個(gè) designated 初始化方法的 convenience一直可以被使用。一個(gè)現(xiàn)成的例子就是上面的 init(bigNum: Bool):如果我們希望這個(gè)初始化方法對(duì)于子類一定可用,那么應(yīng)當(dāng)將 init(num: Int)聲明為必須,這樣我們?cè)谧宇愔姓{(diào)用 init(bigNum: Bool) 時(shí)就始終能夠找到一條完全初始化的路徑了:
class ClassA {
let numA: Int
required init(num: Int) {
numA = num
}
convenience init(bigNum: Bool) {
self.init(num: bigNum ? 10000 : 1)
}
}
class ClassB: ClassA {
let numB: Int
required init(num: Int) {
numB = num + 1
super.init(num: num)
}
}
不僅僅是對(duì) designated 初始化方法,對(duì)于 convenience 的初始化方法,我們也可以加上 required以確保子類對(duì)其進(jìn)行實(shí)現(xiàn)。這在要求子類不直接使用父類中的 convenience 初始化方法時(shí)會(huì)非常有幫助。