swift -- 構(gòu)造器 init 的使用

在Swift中,類的初始化有兩種方式,分別是:
1、Designated Initializer
2、Convenience initializer
Designated Initializer 指指定構(gòu)造器,Convenience initializer為便利構(gòu)造器。
指定構(gòu)造器在一個(gè)類中必須至少有一個(gè),而便利構(gòu)造器的數(shù)量沒有限制。

指定構(gòu)造器(Designated Initializer)

Designated initializers are the primary initializers for a class. A designated initializer fully initializes all properties introduced by that class and calls an appropriate superclass initializer to continue the initialization process up the superclass chain.

指定構(gòu)造器是類的主要構(gòu)造器, 要在指定構(gòu)造器中初始化所有的屬性, 并且要在調(diào)用父類合適的指定構(gòu)造器.

每個(gè)類應(yīng)該只有少量的指定構(gòu)造器, 大多數(shù)類只有一個(gè)指定構(gòu)造器, 我們使用 Swift 做 iOS 開發(fā)時(shí)就會(huì)用到很多 UIKit 框架類的指定構(gòu)造器, 比如說:

init() 
init(frame: CGRect) init(style: UITableViewCellStyle, reuseIdentifier: String?)

這些都是類指定構(gòu)造器, 并且這些方法的前面是沒有任何的關(guān)鍵字的(包括 override).
當(dāng)定義一個(gè)指定構(gòu)造器的時(shí)候, 必須調(diào)用父類的某一個(gè)指定構(gòu)造器:

init(imageName: String, prompt: String = "") { 
    super.init(style: .Default, reuseIdentifier: nil)
     ...
 }

在這里我們的指定構(gòu)造器調(diào)用了父類的指定構(gòu)造器

super.init(style: .Default, reuseIdentifier: nil).

便利構(gòu)造器(Convenience Initializer)

Convenience initializers are secondary, supporting initializers for a class. You can define a convenience initializer to call a designated initializer from the same class as the convenience initializer with some of the designated initializer’s parameters set to default values. You can also define a convenience initializer to create an instance of that class for a specific use case or input value type.

便利構(gòu)造器是類的次要構(gòu)造器, 你需要讓便利構(gòu)造器調(diào)用同一個(gè)類中的指定構(gòu)造器, 并將這個(gè)指定構(gòu)造器中的參數(shù)填上你想要的默認(rèn)參數(shù).

便利構(gòu)造器的語法:

convenience init(parameters) { 
    statements 
}

init 規(guī)則
定義 init 方法必須遵循三條規(guī)則
1、指定構(gòu)造器必須調(diào)用它直接父類的指定構(gòu)造器方法.
2、便利構(gòu)造器必須調(diào)用同一個(gè)類中定義的其它初始化方法.
3、便利構(gòu)造器在最后必須調(diào)用一個(gè)指定構(gòu)造器.
如下圖所示:

24123454_jdQs.png

在圖中, 只有指定構(gòu)造器才可以調(diào)用父類的指定構(gòu)造器, 而便利構(gòu)造器是不可以的, 這也遵循了我們之前所說的三條規(guī)則.
只要 init 方法遵循這三個(gè)規(guī)則就不會(huì)有任何問題.

不過為什么要遵循這三條規(guī)則呢?
init 的方法的調(diào)用機(jī)制是什么呢?


init 機(jī)制
在Swift中一個(gè)實(shí)例的初始化是分為兩個(gè)階段的
1、第一階段是實(shí)例的所有屬性被初始化。
2、第二階段是實(shí)例的所有屬性可以再次的調(diào)整以備之后使用。
而這與Objc的區(qū)別主要在于第一部分,因?yàn)樵贠bjc中所有的屬性如果不賦值都會(huì)默認(rèn)被初始化為nil或者0.而在Swift中可以所有屬性的值由開發(fā)者來指定。

?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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