1.默認構造器
當結構體或者類的所有屬性都有默認值,同時沒有自定義的構造器,這個時候,Swift就會給這些類或者結構體提供一個默認構造器,這個構造器會簡單地創建一個所有屬性值都設置爲默認值的實例。看官方的Swift書是這麼說的。
下面例子中創建了一個類ShoppingListItem,它封裝了購物清單中的某一物品的屬性:名字(name)、數量(quantity)和購買狀態purchase state: |
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()
|
由於ShoppingListItem類中的所有屬性都有默認值,且它是沒有父類的基類,它將自動獲得一個可以爲所有屬性設置默認值的默認構造器(儘管代碼中沒有顯式爲name屬性設置默認值,但由於name是可選字符串類型,它將默認設置爲nil)。上面例子中使用默認構造器創造了一個ShoppingListItem類的實例(使用ShoppingListItem()形式的構造器語法),並將其賦值給變量item。 |
|
|
2.結構體的逐一成員構造器
逐一成員構造器是用來初始化結構體新實例裏成員屬性的快捷方法。我們在調用逐一成員構造器時,通過與成員屬性名相同的參數名進行傳值來完成對成員屬性的初始賦值。
結構體Size自動獲得了一個逐一成員構造器init(width:height:).它可以用來爲Size創建新的實例。
struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0)
3.值類型的構造器代理
值類型的構造器可以通過構造器代理,意思就是大的構造器裏邊可以嵌套笑的構造器,而不需要重複寫那些小的構造器,寫一次,用的時候用self.init就OK。struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y:originY),size: size)
}
}
也就是說有三種不同的構造器方法,用的時候自己按需來使用它們來構造函數,實例化變量.
類的繼承和構造過程
指定構造器與便利構造器
指定構造器
每一個類都必須擁有至少一個指定構造器。指定構造器將初始化類中提供的所有屬性,並根據父類鏈往上吊用父類構造器來實現父類的初始化。很多情況下,子類自動繼承父類的構造器。語法如下:
init (parameters) {
//do init code
}
便利構造器
便利構造器(convenience initializers)是類中比較次要的、輔助型的構造器。你可以定義便利構造器來調用同一個類中的指定構造器,併爲其參數提供默認值。你也可以定義便利構造器來創建一個特殊用途或特定輸入值的實例。
你應當只在必要的時候爲類提供便利構造器,比方說某種情況下通過使用便利構造器來快捷調用某個指定構造
器,能夠節省更多開發時間並讓類的構造過程更清晰明瞭。
convenience init (parameters) {
//do init code
}
問題來了,都是什麼來用這兩個構造器呢?
爲了簡化指定構造器和便利構造器之間的調用關係,Swift 採用以下三條規則來限制構造器之間的代理調用:
規則 1:指定構造器必須調用其直接父類的的指定構造器。
規則 2:便利構造器必須調用同一類中定義的其它構造器。
規則 3:便利構造器必須最終導致一個指定構造器被調用。
一個更方便記憶的方法是:
• 指定構造器必須總是向上代理• 便利構造器必須總是橫向代理