可失敗構(gòu)造器(Failable initializers):
直到一個(gè)可失敗構(gòu)造器完成了它所有的初始化任務(wù)恳啥,它才可以:return nil。因此,比如一個(gè)可失敗子類構(gòu)造器必須在所有的子類屬性被初始化和調(diào)用super.init( ) 之后才可以return nil。(這里有一個(gè)有趣的諷刺:在銷毀實(shí)例之前灸促,構(gòu)造器必須完成建立實(shí)例;但是涵卵,為了保證父類有一個(gè)清晰的的初始化浴栽,這個(gè)工作又是必須的。)
如果一個(gè)被可失敗構(gòu)造器調(diào)用的構(gòu)造器是可失敗的轿偎,這個(gè)調(diào)用語(yǔ)法不會(huì)改變典鸡,并且也不需要其他的檢查——如果一個(gè)被調(diào)用的可失敗構(gòu)造器失敗了,那么整個(gè)初始化進(jìn)程將立刻失敗并終止坏晦。
對(duì)于重寫與代理萝玷,一個(gè)返回隱式解包(init!)的可失敗構(gòu)造器與正常構(gòu)造器被一樣對(duì)待嫁乘。對(duì)于返回可選值的可失敗構(gòu)造器(init?),這里有一些額外的限制要求:
1球碉、init可以重寫init? 蜓斧, 反之不可以
2、init?可以調(diào)用init
3睁冬、init可以調(diào)用init? (通過(guò)使用init并挎春!解包,如果用豆拨?直奋,失敗情況會(huì)導(dǎo)致程序崩潰)
具體見(jiàn)下示例:
TIPS:
子類構(gòu)造器絕不可以為父類設(shè)置常量(let),這是因?yàn)樵谠试S子類做 除了不能初始化自己的屬性和調(diào)用另一個(gè)構(gòu)造器之外 所有事 的時(shí)候施禾,父類已經(jīng)完成了自身的初始化脚线。