swift構(gòu)造器

指定構(gòu)造器

初始化類中提供的所有屬性,并根據(jù)父類鏈往上調(diào)用父類的構(gòu)造器來實現(xiàn)父類的初始化。

最終都是通過指定構(gòu)造器初始化對象,保證每個儲值屬性都有值

init(parameters) {
    statements
}

便利構(gòu)造器

次要的、輔助型的構(gòu)造器

convenience init(parameters) {
    statements
}

  • 指定構(gòu)造器必須總是向上代理
  • 便利構(gòu)造器必須總是橫向代理,并且最終必須導(dǎo)致一個指定構(gòu)造器被調(diào)用
構(gòu)造器的代理關(guān)系示意圖
兩段構(gòu)造過程

類似OC:

  • 第1階段,每個存儲型屬性被引入它們的類指定一個初始值。
  • 第2階段,它給每個類一次機(jī)會,在新實例準(zhǔn)備使用之前進(jìn)一步定制它們的儲值屬性。

編輯器4種安全檢查

  • 1.子類必須先保證自己新增的屬性初始化完成,之后才能代理給父類
  • 2.指定構(gòu)造器必須先向上代理調(diào)用父類構(gòu)造器,然后再為繼承的屬性設(shè)置新值(否則該值會被父類覆蓋)
  • 3.便利構(gòu)造器必須先代理調(diào)用本類中的其它構(gòu)造器,然后再為任意屬性賦新值(否則該值會被本類指定構(gòu)造器覆蓋)
  • 4.構(gòu)造器在第1階段構(gòu)造完成之前,不能調(diào)用任何實例方法,不能讀取任何實例屬性的值,不能引用self作為一個值

構(gòu)造器的繼承和重寫

子類默認(rèn)情況下不會繼承父類的構(gòu)造器,以下2種情況會繼承父類:

假設(shè)子類新屬性都有默認(rèn)值

  • 1.如果子類沒有定義任何指定構(gòu)造器,它將自動繼承所有父類的指定構(gòu)造器。
  • 2.子類實現(xiàn)了所有父類的指定構(gòu)造器(無論是情況1,還是重寫了所有父類的指定構(gòu)造器),它將自動繼承所有父類的便利構(gòu)造器。
構(gòu)造器的代理關(guān)系示意圖

注意 :

子類可以在初始化時修改繼承來的變量屬性,但是不能修改繼承來的常量屬性。

可失敗構(gòu)造器 init? init!

一個類、結(jié)構(gòu)體或枚舉類型的對象,在構(gòu)造過程中有可能失敗,則為其定義一個可失敗構(gòu)造器。這里所指的“失敗”是指,如給構(gòu)造器傳入無效的參數(shù)值,或缺少某種所需的外部資源,又或是不滿足某種必要的條件等。

可失敗構(gòu)造器的參數(shù)名和參數(shù)類型,不能與其它非可失敗構(gòu)造器的參數(shù)名,及其參數(shù)類型相同。

必須構(gòu)造器

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

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