原創(chuàng)文章帮毁,歡迎轉(zhuǎn)載碰凶。轉(zhuǎn)載請(qǐng)注明:關(guān)東升的博客
在構(gòu)造函數(shù)中可以使用構(gòu)造函數(shù)代理幫助完成部分構(gòu)造工作故俐。類(lèi)構(gòu)造函數(shù)代理分為橫向代理和向上代理,橫向代理只能在發(fā)生在同一類(lèi)內(nèi)部胎围,這種構(gòu)造函數(shù)稱(chēng)為便利構(gòu)造函數(shù)吁系。向上代理發(fā)生在繼承的情況下,在子類(lèi)構(gòu)造過(guò)程中白魂,要先調(diào)用父類(lèi)構(gòu)造函數(shù)初始化父類(lèi)的存儲(chǔ)屬性汽纤,這種構(gòu)造函數(shù)稱(chēng)為指定構(gòu)造函數(shù)。
構(gòu)造函數(shù)調(diào)用規(guī)則
Person和Student類(lèi)示例:
class Person {
var name: String
var age: Int
func description() -> String {
return "\(name) 年齡是: \(age)"
}
convenience init () { //便利構(gòu)造函數(shù)
self.init(name: "Tony")
self.age = 18
}
convenience init (name: String) { //便利構(gòu)造函數(shù)
self.init(name: name, age: 18)
}
init (name: String, age: Int) { //指定構(gòu)造函數(shù)
self.name = name
self.age? = age
}
}
class Student: Person {
var school: String
init (name: String, age: Int, school: String) { //指定構(gòu)造函數(shù)
self.school = school
super.init(name: name, age: age)
}
convenience override init (name: String, age: Int) {//便利構(gòu)造函數(shù)
self.init(name: name, age: age, school: "清華大學(xué)")
}
}
let student = Student()
print("學(xué)生: \(student.description())")
構(gòu)造函數(shù)之間的調(diào)用形成了構(gòu)造函數(shù)鏈福荸,如圖所示蕴坪。
Swift限制構(gòu)造函數(shù)之間的代理調(diào)用的規(guī)則有3條,如下所示敬锐。
? 指定構(gòu)造函數(shù)必須調(diào)用其直接父類(lèi)的的指定構(gòu)造函數(shù)背传。從圖可見(jiàn),Student中的④號(hào)指定構(gòu)造函數(shù)調(diào)用Person中的③號(hào)指定構(gòu)造函數(shù)台夺。
? 便利構(gòu)造函數(shù)必須調(diào)用同一類(lèi)中定義的其他構(gòu)造函數(shù)径玖。從圖可見(jiàn),Student中的⑤號(hào)便利構(gòu)造函數(shù)調(diào)用同一類(lèi)中的④號(hào)便利構(gòu)造函數(shù)颤介,Person中的①號(hào)便利構(gòu)造函數(shù)調(diào)用同一類(lèi)中的②號(hào)便利構(gòu)造函數(shù)梳星。
? 便利構(gòu)造函數(shù)必須最終以調(diào)用一個(gè)指定構(gòu)造函數(shù)結(jié)束。從圖可見(jiàn)买窟,Student中的⑤號(hào)便利構(gòu)造函數(shù)調(diào)用同一類(lèi)中的④號(hào)指定構(gòu)造函數(shù)丰泊,Person中的②號(hào)便利構(gòu)造函數(shù)調(diào)用同一類(lèi)中的③號(hào)指定構(gòu)造函數(shù)薯定。