Swift類的構(gòu)造過程

Swift類的存儲型屬性必須在構(gòu)造過程完成后有值掠手,Swift為類提供了兩種構(gòu)造器——指定構(gòu)造器糊渊、便利構(gòu)造器

指定構(gòu)造器
 init(參數(shù)表){
    構(gòu)造過程
 }

指定構(gòu)造器先完成自身類屬性值的初始化爷耀,再調(diào)用父類指定構(gòu)造器完成父類屬性值初始化申屹,一個類可以有多個指定構(gòu)造器蛮放,但至少要有一個(繼承的缩抡,默認(rèn)的都算)。在指定構(gòu)造器中不可以調(diào)用本類其他構(gòu)造器包颁,只能向上代理

便利構(gòu)造器
  convenience init(參數(shù)表){
    構(gòu)造過程
  }

便利構(gòu)造器必須調(diào)用本類其他構(gòu)造器完成初始化瞻想,而且最終必須導(dǎo)致本類一個指定構(gòu)造器被調(diào)用,便利構(gòu)造器不可以直接調(diào)用父類構(gòu)造器娩嚼,只能橫向代理

總結(jié)為三條規(guī)則:

1蘑险、指定構(gòu)造器必須調(diào)用其直接父類(如果有)的指定構(gòu)造器(先初始化自己的屬性,然后調(diào)用父類的構(gòu)造器初始化父類的屬性)
2岳悟、便利構(gòu)造器必須調(diào)用本類中其他構(gòu)造器
3漠其、便利構(gòu)造器最終需要導(dǎo)致一個指定構(gòu)造器調(diào)用

指定構(gòu)造器必須總是向上代理,便利構(gòu)造器必須總是橫向代理

構(gòu)造過程

兩段式構(gòu)造過程

第一階段:

1、構(gòu)造器被調(diào)用
2和屎、分配內(nèi)存拴驮,未初始化
3、指定構(gòu)造器為本類存儲屬性賦初值柴信,本類存儲屬性完成初始化
4套啤、向上調(diào)用父類指定構(gòu)造器,重復(fù)類似3随常,4過程潜沦,直到頂部類
5、自下而上所有存儲屬性完成初始化绪氛,第一階段完成


第一階段
第二階段:

1唆鸡、從頂部往下,每一層的指定構(gòu)造器都有機(jī)會進(jìn)一步定制本類實(shí)例枣察,此時構(gòu)造器可以訪問self争占,修改屬性,調(diào)用實(shí)例方法等序目,也就是說在未完全初始化時臂痕,實(shí)例是不可以使用的
2、最終猿涨,任意構(gòu)造器鏈中的便利構(gòu)造器都可以定制實(shí)例和使用self


第二階段
編譯器進(jìn)行四種安全檢查保證上述構(gòu)造準(zhǔn)確進(jìn)行
  • 指定構(gòu)造器先初始化本類的存儲屬性后握童,才可以向上代理給父類的指定構(gòu)造器
  • 指定構(gòu)造器必須要在調(diào)用父類的指定構(gòu)造器后,才可以為繼承來的屬性賦新值叛赚,不然就被父類初始值覆蓋
  • 便利構(gòu)造器必須先調(diào)用本類其他構(gòu)造器澡绩,才能為屬性賦新值,不然會被初始值覆蓋
  • 構(gòu)造器在第一階段完成前俺附,不能調(diào)用實(shí)例方法英古,不能讀取實(shí)例屬性值,不能引用self作為一個值

默認(rèn)構(gòu)造器

默認(rèn)構(gòu)造器就是不帶參數(shù)的構(gòu)造器昙读,當(dāng)類中沒有提供任何構(gòu)造器時(繼承來的也算)召调,屬性都有默認(rèn)值時, 編譯器會提供一個默認(rèn)構(gòu)造器

class ABC{
    var a:Int = 1
    var b:Int = 2
    var c:Int = 3
}

var abc = ABC()//編譯器會提供一個默認(rèn)的構(gòu)造器
print(abc.a,abc.b,abc.c)
class A {
    init() {
    }
}

沒有問題蛮浑,默認(rèn)就是這樣唠叛,我們寫了和默認(rèn)編譯器一樣的東西,也就是說我們可以自己定義指定型的默認(rèn)構(gòu)造器

class A {
    convenience init() {
        self.init()
    }
}

編譯報(bào)init()重定義沮稚,便利構(gòu)造器不會阻止編譯器自動生成默認(rèn)構(gòu)造器艺沼,和默認(rèn)構(gòu)造器重名,所以報(bào)錯

class A {
    var a:Int
    init(a:Int) {
        self.a = a
    }
    convenience init() {
        self.init()
    }
}

這段代碼編譯不報(bào)錯蕴掏,運(yùn)行階段調(diào)用init()進(jìn)入死循環(huán)障般,我們有init(a:int)调鲸,所以編譯器不會自動生成默認(rèn)構(gòu)造器,然后我們寫convenience init()挽荡,也不會報(bào)錯藐石,奇怪的是構(gòu)造過程并不滿足三條規(guī)則中的規(guī)則三,因?yàn)橐呀?jīng)沒有了指定的默認(rèn)構(gòu)造器定拟,然而編譯器不報(bào)錯于微,運(yùn)行卻進(jìn)入死循環(huán),妥妥的編譯器bug

子類中訪問父類的屬性,用selfsuper都行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市介蛉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吵冒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡荠藤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門呆万,熙熙樓的掌柜王于貴愁眉苦臉地迎上來商源,“玉大人车份,你說我怎么就攤上這事谋减。” “怎么了扫沼?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵出爹,是天一觀的道長。 經(jīng)常有香客問我缎除,道長严就,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任器罐,我火速辦了婚禮梢为,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轰坊。我一直安慰自己铸董,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布肴沫。 她就那樣靜靜地躺著粟害,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颤芬。 梳的紋絲不亂的頭發(fā)上悲幅,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天套鹅,我揣著相機(jī)與錄音,去河邊找鬼汰具。 笑死卓鹿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郁副。 我是一名探鬼主播减牺,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼存谎!你這毒婦竟也來了拔疚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤既荚,失蹤者是張志新(化名)和其女友劉穎稚失,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恰聘,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡句各,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晴叨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凿宾。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兼蕊,靈堂內(nèi)的尸體忽然破棺而出初厚,到底是詐尸還是另有隱情,我是刑警寧澤孙技,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布产禾,位于F島的核電站,受9級特大地震影響牵啦,放射性物質(zhì)發(fā)生泄漏亚情。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一哈雏、第九天 我趴在偏房一處隱蔽的房頂上張望楞件。 院中可真熱鬧,春花似錦裳瘪、人聲如沸土浸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栅迄。三九已至,卻和暖如春皆怕,著一層夾襖步出監(jiān)牢的瞬間毅舆,已是汗流浹背西篓。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憋活,地道東北人岂津。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像悦即,于是被迫代替她去往敵國和親吮成。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本章將會介紹 存儲屬性的初始賦值自定義構(gòu)造過程默認(rèn)構(gòu)造器值類型的構(gòu)造器代理類的繼承和構(gòu)造過程可失敗構(gòu)造器必要構(gòu)造器...
    寒橋閱讀 767評論 0 0
  • 構(gòu)造過程是使用類、結(jié)構(gòu)體或枚舉類型的實(shí)例之前的準(zhǔn)備過程作瞄。在新實(shí)例可用前必須執(zhí)行這個過程茶宵,具體操作包括設(shè)置實(shí)例中每個...
    莽原奔馬668閱讀 680評論 0 3
  • 123.繼承 一個類可以從另外一個類繼承方法,屬性和其他特征。當(dāng)一個類繼承另外一個類時, 繼承類叫子類, 被繼承的...
    無灃閱讀 1,380評論 2 4
  • ?構(gòu)造過程是使用類宗挥、結(jié)構(gòu)體或枚舉類型一個實(shí)例的準(zhǔn)備過程乌庶。在新實(shí)例可用前必須執(zhí)行這個過程,具體操作包括設(shè)置實(shí)例中每個...
    EndEvent閱讀 629評論 0 3
  • 服務(wù)一位學(xué)員,像照妖鏡一樣搪桂,看到了自己的影子透敌。她隨時都在關(guān)注另一半怎麼想?什麼態(tài)度锅棕?怎麼安排拙泽?而把自己完全的忽略淌山。...
    粟莎閱讀 177評論 0 0