Swift:兩段式的構(gòu)造過(guò)程

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

Swift 中類的構(gòu)造過(guò)程包含兩個(gè)階段抢腐。第一個(gè)階段旷档,每個(gè)存儲(chǔ)型屬性被引入它們的類指定一個(gè)初始值。當(dāng)每個(gè)存儲(chǔ)型屬性的初始值被確定后严里,第二階段開始新啼,它給每個(gè)類一次機(jī)會(huì),在新實(shí)例準(zhǔn)備使用之前進(jìn)一步定制它們的存儲(chǔ)型屬性刹碾。

兩段式構(gòu)造過(guò)程的使用讓構(gòu)造過(guò)程更安全燥撞,同時(shí)在整個(gè)類層級(jí)結(jié)構(gòu)中給予了每個(gè)類完全的靈活性。兩段式構(gòu)造過(guò)程可以防止屬性值在初始化之前被訪問迷帜,也可以防止屬性被另外一個(gè)構(gòu)造器意外地賦予不同的值物舒。

注意
Swift 的兩段式構(gòu)造過(guò)程跟 Objective-C 中的構(gòu)造過(guò)程類似。最主要的區(qū)別在于階段 1戏锹,Objective-C 給每一個(gè)屬性賦值0或空值(比如說(shuō)0或nil)冠胯。Swift 的構(gòu)造流程則更加靈活,它允許你設(shè)置定制的初始值锦针,并自如應(yīng)對(duì)某些屬性不能以0或nil作為合法默認(rèn)值的情況荠察。

Swift 編譯器將執(zhí)行 4 種有效的安全檢查置蜀,以確保兩段式構(gòu)造過(guò)程能不出錯(cuò)地完成:

安全檢查 1

指定構(gòu)造器必須保證它所在類引入的所有屬性都必須先初始化完成,之后才能將其它構(gòu)造任務(wù)向上代理給父類中的構(gòu)造器悉盆。

如上所述盯荤,一個(gè)對(duì)象的內(nèi)存只有在其所有存儲(chǔ)型屬性確定之后才能完全初始化。為了滿足這一規(guī)則焕盟,指定構(gòu)造器必須保證它所在類引入的屬性在它往上代理之前先完成初始化秋秤。

安全檢查 2

指定構(gòu)造器必須先向上代理調(diào)用父類構(gòu)造器,然后再為繼承的屬性設(shè)置新值脚翘。如果沒這么做灼卢,指定構(gòu)造器賦予的新值將被父類中的構(gòu)造器所覆蓋。

安全檢查 3

便利構(gòu)造器必須先代理調(diào)用同一類中的其它構(gòu)造器来农,然后再為任意屬性賦新值芥玉。如果沒這么做,便利構(gòu)造器賦予的新值將被同一類中其它指定構(gòu)造器所覆蓋备图。

安全檢查 4

構(gòu)造器在第一階段構(gòu)造完成之前灿巧,不能調(diào)用任何實(shí)例方法,不能讀取任何實(shí)例屬性的值揽涮,不能引用self作為一個(gè)值抠藕。

類實(shí)例在第一階段結(jié)束以前并不是完全有效的。只有第一階段完成后蒋困,該實(shí)例才會(huì)成為有效實(shí)例盾似,才能訪問屬性和調(diào)用方法。

以下是兩段式構(gòu)造過(guò)程中基于上述安全檢查的構(gòu)造流程展示:

階段 1
  • 某個(gè)指定構(gòu)造器或便利構(gòu)造器被調(diào)用雪标。
  • 完成新實(shí)例內(nèi)存的分配零院,但此時(shí)內(nèi)存還沒有被初始化。
  • 指定構(gòu)造器確保其所在類引入的所有存儲(chǔ)型屬性都已賦初值村刨。存儲(chǔ)型屬性所屬的內(nèi)存完成初始化告抄。
  • 指定構(gòu)造器將調(diào)用父類的構(gòu)造器,完成父類屬性的初始化嵌牺。
  • 這個(gè)調(diào)用父類構(gòu)造器的過(guò)程沿著構(gòu)造器鏈一直往上執(zhí)行打洼,直到到達(dá)構(gòu)造器鏈的最頂部。
    當(dāng)?shù)竭_(dá)了構(gòu)造器鏈最頂部逆粹,且已確保所有實(shí)例包含的存儲(chǔ)型屬性都已經(jīng)賦值募疮,這個(gè)實(shí)例的內(nèi)存被認(rèn)為已經(jīng)完全初始化。此時(shí)階段 1 完成僻弹。
階段 2
  • 從頂部構(gòu)造器鏈一直往下阿浓,每個(gè)構(gòu)造器鏈中類的指定構(gòu)造器都有機(jī)會(huì)進(jìn)一步定制實(shí)例。構(gòu)造器此時(shí)可以訪問self蹋绽、修改它的屬性并調(diào)用實(shí)例方法等等芭毙。
  • 最終筋蓖,任意構(gòu)造器鏈中的便利構(gòu)造器可以有機(jī)會(huì)定制實(shí)例和使用self。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稿蹲,一起剝皮案震驚了整個(gè)濱河市扭勉,隨后出現(xiàn)的幾起案子鹊奖,更是在濱河造成了極大的恐慌苛聘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忠聚,死亡現(xiàn)場(chǎng)離奇詭異设哗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)两蟀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門网梢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人赂毯,你說(shuō)我怎么就攤上這事战虏。” “怎么了党涕?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵烦感,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我膛堤,道長(zhǎng)手趣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任肥荔,我火速辦了婚禮绿渣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘燕耿。我一直安慰自己中符,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布誉帅。 她就那樣靜靜地躺著舟茶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪堵第。 梳的紋絲不亂的頭發(fā)上吧凉,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音踏志,去河邊找鬼阀捅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛针余,可吹牛的內(nèi)容都是我干的饲鄙。 我是一名探鬼主播凄诞,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼忍级!你這毒婦竟也來(lái)了帆谍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轴咱,失蹤者是張志新(化名)和其女友劉穎汛蝙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朴肺,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窖剑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戈稿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片西土。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞍盗,靈堂內(nèi)的尸體忽然破棺而出需了,到底是詐尸還是另有隱情,我是刑警寧澤般甲,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布肋乍,位于F島的核電站,受9級(jí)特大地震影響欣除,放射性物質(zhì)發(fā)生泄漏住拭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一历帚、第九天 我趴在偏房一處隱蔽的房頂上張望滔岳。 院中可真熱鬧,春花似錦挽牢、人聲如沸谱煤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刘离。三九已至,卻和暖如春睹栖,著一層夾襖步出監(jiān)牢的瞬間硫惕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工野来, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恼除,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像豁辉,于是被迫代替她去往敵國(guó)和親令野。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 本章將會(huì)介紹 存儲(chǔ)屬性的初始賦值自定義構(gòu)造過(guò)程默認(rèn)構(gòu)造器值類型的構(gòu)造器代理類的繼承和構(gòu)造過(guò)程可失敗構(gòu)造器必要構(gòu)造器...
    寒橋閱讀 769評(píng)論 0 0
  • 構(gòu)造過(guò)程是使用類、結(jié)構(gòu)體或枚舉類型的實(shí)例之前的準(zhǔn)備過(guò)程餐抢。在新實(shí)例可用前必須執(zhí)行這個(gè)過(guò)程现使,具體操作包括設(shè)置實(shí)例中每個(gè)...
    莽原奔馬668閱讀 683評(píng)論 0 3
  • 123.繼承 一個(gè)類可以從另外一個(gè)類繼承方法,屬性和其他特征。當(dāng)一個(gè)類繼承另外一個(gè)類時(shí), 繼承類叫子類, 被繼承的...
    無(wú)灃閱讀 1,392評(píng)論 2 4
  • HTML 格式化標(biāo)簽HTML 使用標(biāo)簽 與 對(duì)輸出的文本進(jìn)行格式, 如:粗體 or 斜體這些HTML標(biāo)簽被稱為...
    Amy莫莫閱讀 284評(píng)論 0 1
  • 這一年弹澎,我們?cè)谏虾D阍蠈W(xué)的地方游蕩朴下; 我們吃遍了西安回民街里的所有美食努咐; 我們?cè)谇鄭u大海邊吵過(guò)架苦蒿; 這一年 你拉...
    大大大K閱讀 422評(píng)論 0 1