初始化方法永遠遵循以下兩個原則:
1.初始化路徑必須保證對象完全初始化塞耕,這可以通過調用本類型的 designated 初始化方法來得到保證;
2.子類的 designated 初始化方法必須調用父類的 designated 方法,以保證父類也完成初始化沿盅。
對于某些我們希望子類中一定實現(xiàn)的 designated 初始化方法什乙,我們可以通過添加 required 關鍵字進行限制,強制子類對這個方法重寫實現(xiàn)雹熬。這樣做的最大的好處是可以保證依賴于某個 designated 初始化方法的 convenience一直可以被使用。一個現(xiàn)成的例子就是上面的 init(bigNum: Bool):如果我們希望這個初始化方法對于子類一定可用谣膳,那么應當將 init(num: Int)聲明為必須竿报,這樣我們在子類中調用 init(bigNum: Bool) 時就始終能夠找到一條完全初始化的路徑了:
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)
}
}
不僅僅是對 designated 初始化方法,對于 convenience 的初始化方法参歹,我們也可以加上 required以確保子類對其進行實現(xiàn)仰楚。這在要求子類不直接使用父類中的 convenience 初始化方法時會非常有幫助。