1.可失敗構(gòu)造器
語法為在
init關(guān)鍵字后面添加問好init?可失敗構(gòu)造器的參數(shù)名和參數(shù)類型,不能與其它非可失敗構(gòu)造器的參數(shù)名及參數(shù)類型相同。
-
可失敗構(gòu)造器會創(chuàng)建一個類型為自身的可選類型的對象,通過
return nil語句表明可失敗構(gòu)造器在任何情況下應(yīng)該失敗struct Animal { let species: String init?(species: String) { if species.isEmpty { return nil } self.species = species } } //如果species這個字符串為空,則構(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òu)造過程將立即終止,接下來的任何構(gòu)造代碼不會再被執(zhí)行。
3.可失敗構(gòu)造器 init!
通常來說我們通過在init關(guān)鍵字后添加問號的方式init?來定義一個可失敗構(gòu)造器,但你也可以通過在init后面添加驚嘆號的方式來定義一個可失敗構(gòu)造器init!,該可失敗構(gòu)造器將會構(gòu)建一個對應(yīng)類型的隱式解包可選類型的對象。
你可以在init?中代理到init!,反之亦然。你也可以init?重寫init!,反之亦然。你還可以用init代理到init!,不過,一旦init!構(gòu)造失敗,則會觸發(fā)一個斷言。
4.必要構(gòu)造器
在類的構(gòu)造器前添加required修飾符表明所有該類的子類都必須實(shí)現(xiàn)該構(gòu)造器:
class SomeClass {
required init() {
// 構(gòu)造器的實(shí)現(xiàn)代碼
}
}