本文和大家分享的主要是swift中類的兩段式構(gòu)造相關(guān)內(nèi)容,一起來看看吧,希望對大家學(xué)習(xí)swift有所幫助。
兩段式構(gòu)造
第一階段:
1. 程序調(diào)用子類的某個構(gòu)造器
2. 為實例分配內(nèi)存, 此時實例的內(nèi)存還沒有被初始化
3. 指定構(gòu)造器確保子類定義的所有實例存儲屬性都已被賦初值
4. 指定構(gòu)造器將調(diào)用父類的構(gòu)造器, 完成父類定義的實例存儲屬性的初始化
5. 沿著調(diào)用父類構(gòu)造器的構(gòu)造器鏈一直往上執(zhí)行, 直到到達(dá)構(gòu)造器鏈的最頂部
第二階段:
1. 沿著繼承樹往下, 構(gòu)造器此時可以修改實例屬性和訪問self, 甚至可以調(diào)用實例方法
2.
最后, 構(gòu)造器鏈中的便利構(gòu)造器都有機會定制實例和使用self
3.
為了使得構(gòu)造過程更加安全, Swift進(jìn)行了安全檢查
4.
安全檢查
· 安全檢查 1:指定構(gòu)造器必須先初始化當(dāng)前類中定義的實例存儲屬性, 然后才能向上調(diào)用父類構(gòu)造器
· 安全檢查 2:指定構(gòu)造器必須向上調(diào)用父類構(gòu)造器, 然后才能對繼承得到的屬性賦值
· 安全檢查 3:便利構(gòu)造器必須先調(diào)用同一個類的其他構(gòu)造器, 然后才能對屬性賦值
· 安全檢查 4:構(gòu)造器在第一階段完成之前, 不能調(diào)用實例方法, 不能讀取實例屬性
class Person {
var height: Double
var weight: Double
// 定義指定構(gòu)造器
init(height: Double, weight: Double) {
self.height = height
self.weight = weight
}
// 定義便利構(gòu)造器(使用convenience修飾)
convenience init(h height: Double, w weight: Double) {
self.init(height: height, weight: weight)
}
}
class Man: Person {
var sex: String!
init(sex: String, height: Double, weight: Double) {
// print(super.height) 不能再父類初始化之前調(diào)用父類中的屬性
super.init(height: height, weight: weight)
super.height = 178
print(self.height)
// print(self.sex) 不能在本類中的屬性沒有進(jìn)行初始化的時候進(jìn)行調(diào)用
// 會出現(xiàn):fatal error: unexpectedly found nil while unwrapping an Optional value錯誤
self.sex = sex
print(self.sex)
}
convenience init(s sex: String, h height: Double, weight: Double) {
// 在調(diào)用其他構(gòu)造器之前, 不能訪問或修改任何實例存儲屬性
// print(self.height) 錯誤
// super.height = height 錯誤
self.init(sex: sex, height: height, weight: weight)
}
}
var man = Man(sex: "男", height: 178, weight: 62.0)
來源:Cmb Blog