在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)造器.
如下圖所示:

在圖中, 只有指定構(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ā)者來指定。