需要主動調(diào)用父類 designated initializers
1. 子類designated initializers (有調(diào)用自身函數(shù)) 代碼如下:
class Name: NSObject {
override init() {
super.init() /// 需要調(diào)用父類initializers(任意一個)<編譯器無法隱式添加拜英,如果全是屬性那直接添加在函數(shù)最后彤守,但由于出現(xiàn)了函數(shù)調(diào)用甜攀,那么編譯器并不知道是先讓父類的構(gòu)造函數(shù)先執(zhí)行來對屬性進(jìn)行設(shè)置還是先調(diào)子類函數(shù)<函數(shù)可以使用父類屬性>,這個順序是會產(chǎn)生不同的執(zhí)行效果的右犹,所以這里需要開發(fā)顯示調(diào)用>
self.nameFunc() /// 調(diào)用自己的函數(shù)
}
func nameFunc() {}
}
2. 父類有init()之外的designated initializers構(gòu)造函數(shù)(就算所有屬性都被初始化,同樣適用) 代碼如下:
class User {
var name: String = ""
var age: Int = 0
/// 沒有這個構(gòu)造器辐董,那么子類就可以不調(diào)用父類(同時伐坏,如果父類有唯一的init(),那么編譯器會在子類構(gòu)造函數(shù)中添加對父類init()的調(diào)用)
init(name: String, age: Int) {
self.name = name
self.age = age
}
init() {
self.call()
}
func call() {
/// 只有init的話击胜,就算子類沒顯示調(diào)用亏狰,該函數(shù)也會執(zhí)行
print("init called")
}
}
class Teatcher: User {
var scholl: String
init(scholl: String) {
self.scholl = scholl
super.init() /// 需要明確調(diào)用哪一個為父類初始化(任意一個)
}
}
總結(jié)就是,當(dāng)父類有構(gòu)造函數(shù):
- 子類一定要調(diào)用父類的構(gòu)造函數(shù)
- 如果編譯器不能隱式添加父類的調(diào)用偶摔,一定要顯示添加
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者