Swift 十二:構(gòu)造方法深入分析篇

1).類的指定構(gòu)造方法和便利構(gòu)造方法

class MyClass {
    
    var a = 0
    
    var b = 0
    
    init(a : Int , b : Int) {     //指定構(gòu)造方法
        
        self.a = a
        
        self.b = b
    }
    
    convenience init(a : Int) {
        
        self.init(a: a , b : 0)   //調(diào)用指定構(gòu)造方法
        
    }
    
    convenience init(b : Int) {   //調(diào)用其他便利構(gòu)造方法 
        
        self.init(a:10)
    }
}

指定構(gòu)造(Designated Initializer)方法中,不允許出現(xiàn)構(gòu)造器代理self.init(...)

便利構(gòu)造(Convenience Initializer)方法中,一定是通過(guò)調(diào)用其他的指定構(gòu)造方法或者便利構(gòu)造方法來(lái)實(shí)現(xiàn)初始化的。

(類似于枚舉或者結(jié)構(gòu)體中的構(gòu)造器代理)


2).派生類的構(gòu)造方法

class SubClass: MyClass {  //繼承自上面的MyClass
    
    var c = 10
    
    init(c : Int) {
        
        self.c = c                //《2》
        
        super.init(a: 10, b: 10)  //《1》
    }
}

《1》構(gòu)造方法默認(rèn)是不會(huì)被繼承的,基類的存儲(chǔ)屬性只能通過(guò)基類的構(gòu)造方法來(lái)初始化

《2》派生類引入的存儲(chǔ)屬性要先被初始化,然后再調(diào)用父類的構(gòu)造方法對(duì)父類的屬性進(jìn)行初始化

《3》只能通過(guò)調(diào)用父類的指定構(gòu)造方法,而不是便利構(gòu)造方法來(lái)對(duì)父類的屬性進(jìn)行初始化


3).構(gòu)造器鏈

  • 派生類的指定方法構(gòu)造器,必須調(diào)用其直接父類的指定構(gòu)造器

  • 便利構(gòu)造器必須調(diào)用同類中定義的其他的構(gòu)造器(指定和便利均可)

  • 便利構(gòu)造器必須最終以調(diào)用一個(gè)指定構(gòu)造器來(lái)完成

指定構(gòu)造器總是向上代理

便利構(gòu)造器總是橫向代理

![image](file:/Users/Yangzhiyong/Desktop/baseImage.png)


4).兩段式構(gòu)造

class SubClass: MyClass {  //繼承自上面的MyClass
    
    var c = 10
    
    init(c : Int) {
    
    ---第一階段
        
        self.c = c                //《2》
        
        super.init(a: 10, b: 10)  //《1》
        
        print("第一階段")
        
    ---第二階段

        self.a = 10000
        print("第二階段")
    }
}

第一階段:確保所有的存儲(chǔ)屬性都初始化完畢

第二階段:對(duì)父類中的存儲(chǔ)屬性作進(jìn)一步的處理

兩段式構(gòu)造可以防止屬性在被初始化之前訪問(wèn),也可以防止屬性被另外一個(gè)構(gòu)造器意外的賦值

如果A為父類,B繼承自A,C繼承自B,按照上面的print運(yùn)行,則結(jié)果為:

C: 第一階段

B:第一階段

A:第一階段

A:第二階段

B:第二階段

C:第二階段

構(gòu)造方法的編譯時(shí)檢查原則:

  • 首先應(yīng)該將派生類引入的存儲(chǔ)屬性初始化,然后再向上代理父類的指定構(gòu)造方法

  • 首先調(diào)用父類中的指定構(gòu)造器實(shí)現(xiàn)父類中屬性的初始化之后,才可以訪問(wèn)父類中的屬性。

  • 在編寫(xiě)便利構(gòu)造器方法時(shí),我們首先要調(diào)用同類中的其他構(gòu)造方法,然后才可以訪問(wèn)任意屬性。

  • 在第一階段完成之前,我們不能調(diào)用任何實(shí)例方法,不能訪問(wèn)任何父類中定義的存儲(chǔ)屬性,也不能引用self。


6).重寫(xiě)指定構(gòu)造方法(Designated Initalizer)

指定構(gòu)造方法存在重寫(xiě),可以在子類中重寫(xiě)為指定構(gòu)造方法或者便利構(gòu)造方法均可

便利構(gòu)造方法不存在重寫(xiě),在子類中“重寫(xiě)”時(shí),不需要加關(guān)鍵字override。

這是因?yàn)楸憷麡?gòu)造方法只能橫向代理,不可以通過(guò)super關(guān)鍵字來(lái)向上代理,所以便利構(gòu)造方法跟子類沒(méi)有任何關(guān)系。


7).構(gòu)造器的自動(dòng)繼承

子類自動(dòng)繼承構(gòu)造方法的條件:

  • 如果子類中沒(méi)有定義任何的構(gòu)造方法,且子類中所有的存儲(chǔ)屬性都有默認(rèn)缺省值,則會(huì)自動(dòng)竭誠(chéng)父類中所有的構(gòu)造方法(包括便利構(gòu)造方法)
  • 如果子類中只是重寫(xiě)了父類中的某些(而不是全部)指定構(gòu)造方法,不管子類中的存儲(chǔ)屬性是否有缺省值,都不會(huì)繼承父類中的其他構(gòu)造方法。
  • 如果子類中重寫(xiě)了父類中所有的指定構(gòu)造方法,不管子類中的存儲(chǔ)屬性是否有缺省值,都會(huì)同時(shí)繼承父類中所有的便利構(gòu)造方法

8).必須構(gòu)造器

必須構(gòu)造方法是指:該構(gòu)造方法所屬的類的后續(xù)子類必須也得實(shí)現(xiàn)這個(gè)構(gòu)造方法。關(guān)鍵字required

class MyClass {
    
    required init(a : Int , b : Int) {

        print("super")
    }
}

class SubClass: MyClass {
    
    required init(a: Int, b: Int) {
        
        print("child")
        
        super.init(a: a, b: b)
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本章將會(huì)介紹 存儲(chǔ)屬性的初始賦值自定義構(gòu)造過(guò)程默認(rèn)構(gòu)造器值類型的構(gòu)造器代理類的繼承和構(gòu)造過(guò)程可失敗構(gòu)造器必要構(gòu)造器...
    寒橋閱讀 839評(píng)論 0 0
  • 構(gòu)造過(guò)程是使用類、結(jié)構(gòu)體或枚舉類型的實(shí)例之前的準(zhǔn)備過(guò)程。在新實(shí)例可用前必須執(zhí)行這個(gè)過(guò)程,具體操作包括設(shè)置實(shí)例中每個(gè)...
    莽原奔馬668閱讀 751評(píng)論 0 3
  • 構(gòu)造過(guò)程 構(gòu)造過(guò)程是使用類、結(jié)構(gòu)體或枚舉類型的實(shí)例之前的準(zhǔn)備過(guò)程。在新實(shí)例可用前必須執(zhí)行這個(gè)過(guò)程,具體操作包括設(shè)置...
    蠱毒_閱讀 785評(píng)論 0 2
  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,428評(píng)論 1 6
  • (一)然而,他的激情讓他很難實(shí)現(xiàn)真正的涅;內(nèi)在的平靜、內(nèi)心的平和、為人的圓潤(rùn)這些禪修者的特征,并未在他身上顯現(xiàn)出來(lái)...
    Stone_soul閱讀 217評(píng)論 0 0

友情鏈接更多精彩內(nèi)容