1.可失敗構(gòu)造器
語法為在
init
關(guān)鍵字后面添加問好init?
可失敗構(gòu)造器的參數(shù)名和參數(shù)類型诲泌,不能與其它非可失敗構(gòu)造器的參數(shù)名及參數(shù)類型相同敷扫。
-
可失敗構(gòu)造器會(huì)創(chuàng)建一個(gè)類型為自身的可選類型的對(duì)象葵第,通過
return nil
語句表明可失敗構(gòu)造器在任何情況下應(yīng)該失敗struct Animal { let species: String init?(species: String) { if species.isEmpty { return nil } self.species = species } } //如果species這個(gè)字符串為空,則構(gòu)造失敗缀台。 let someCreature = Animal(species: "Giraffe") // someCreature 的類型是 Animal? 而不是 Animal if let giraffe = someCreature { print("\(giraffe.species)") } // 打印 "Giraffe"
2.構(gòu)造失敗的傳遞
類将硝,結(jié)構(gòu)體屏镊,枚舉的可失敗構(gòu)造器可以橫向代理到類型中的其他可失敗構(gòu)造器而芥。類似的,子類的可失敗構(gòu)造器也能向上代理到父類的可失敗構(gòu)造器误辑。
無論是向上代理還是橫向代理歌逢,如果你代理到的其他可失敗構(gòu)造器觸發(fā)構(gòu)造失敗秘案,整個(gè)構(gòu)造過程將立即終止阱高,接下來的任何構(gòu)造代碼不會(huì)再被執(zhí)行。
3.可失敗構(gòu)造器 init!
通常來說我們通過在init
關(guān)鍵字后添加問號(hào)的方式init?
來定義一個(gè)可失敗構(gòu)造器吼旧,但你也可以通過在init后面添加驚嘆號(hào)的方式來定義一個(gè)可失敗構(gòu)造器init!
圈暗,該可失敗構(gòu)造器將會(huì)構(gòu)建一個(gè)對(duì)應(yīng)類型的隱式解包可選類型的對(duì)象员串。
你可以在init?
中代理到init!,反之亦然。你也可以init?
重寫init!
访忿,反之亦然海铆。你還可以用init
代理到init!
卧斟,不過憎茂,一旦init!
構(gòu)造失敗竖幔,則會(huì)觸發(fā)一個(gè)斷言拳氢。
4.必要構(gòu)造器
在類的構(gòu)造器前添加required
修飾符表明所有該類的子類都必須實(shí)現(xiàn)該構(gòu)造器:
class SomeClass {
required init() {
// 構(gòu)造器的實(shí)現(xiàn)代碼
}
}