指定構(gòu)造器
初始化類中提供的所有屬性,并根據(jù)父類鏈往上調(diào)用父類的構(gòu)造器來實現(xiàn)父類的初始化。
最終都是通過指定構(gòu)造器初始化對象,保證每個儲值屬性都有值
init(parameters) {
statements
}
便利構(gòu)造器
次要的、輔助型的構(gòu)造器
convenience init(parameters) {
statements
}
- 指定構(gòu)造器必須總是向上代理
- 便利構(gòu)造器必須總是橫向代理,并且最終必須導(dǎo)致一個指定構(gòu)造器被調(diào)用

構(gòu)造器的代理關(guān)系示意圖
兩段構(gòu)造過程
類似OC:
- 第1階段,每個存儲型屬性被引入它們的類指定一個初始值。
- 第2階段,它給每個類一次機(jī)會,在新實例準(zhǔn)備使用之前進(jìn)一步定制它們的儲值屬性。
編輯器4種安全檢查
- 1.子類必須先保證自己新增的屬性初始化完成,之后才能代理給父類
- 2.指定構(gòu)造器必須先向上代理調(diào)用父類構(gòu)造器,然后再為繼承的屬性設(shè)置新值(否則該值會被父類覆蓋)
- 3.便利構(gòu)造器必須先代理調(diào)用本類中的其它構(gòu)造器,然后再為任意屬性賦新值(否則該值會被本類指定構(gòu)造器覆蓋)
- 4.構(gòu)造器在第1階段構(gòu)造完成之前,不能調(diào)用任何實例方法,不能讀取任何實例屬性的值,不能引用self作為一個值
構(gòu)造器的繼承和重寫
子類默認(rèn)情況下不會繼承父類的構(gòu)造器,以下2種情況會繼承父類:
假設(shè)子類新屬性都有默認(rèn)值
- 1.如果子類沒有定義任何指定構(gòu)造器,它將自動繼承所有父類的指定構(gòu)造器。
- 2.子類實現(xiàn)了所有父類的指定構(gòu)造器(無論是情況1,還是重寫了所有父類的指定構(gòu)造器),它將自動繼承所有父類的便利構(gòu)造器。

構(gòu)造器的代理關(guān)系示意圖
注意 :
子類可以在初始化時修改繼承來的變量屬性,但是不能修改繼承來的常量屬性。
可失敗構(gòu)造器 init? init!
一個類、結(jié)構(gòu)體或枚舉類型的對象,在構(gòu)造過程中有可能失敗,則為其定義一個可失敗構(gòu)造器。這里所指的“失敗”是指,如給構(gòu)造器傳入無效的參數(shù)值,或缺少某種所需的外部資源,又或是不滿足某種必要的條件等。
可失敗構(gòu)造器的參數(shù)名和參數(shù)類型,不能與其它非可失敗構(gòu)造器的參數(shù)名,及其參數(shù)類型相同。
必須構(gòu)造器
required init() {
// 構(gòu)造器的實現(xiàn)代碼
}