Swift構造器
構造器(Initializers)
擴展可以向已有類型添加新的構造器。這可以讓你擴展其它類型,將你自己的定製類型作為構造器參數,或者提供該類型的原始實現中冇有包含的額外初始化選項。
擴展能向類中添加新的便利構造器,但是它們不能向類中添加新的指定構造器或析構函數。指定構造器和析構函數必須總是由原始的類實現來提供。
注意:
如果你使用擴展向一個值類型添加一個構造器,該構造器向所有的存儲屬性提供默認值,而且冇有定義任何定製構造器(custom initializers),那麼對於來自你的擴展構造器中的值類型,你可以調用默認構造器(default initializers)和逐一成員構造器(memberwise initializers)。
正如在值類型的構造器授權中描述的,如果你已經把構造器寫成值類型原始實現的一部分,上述規則不再適用。
下麵的例子定義了一個用於描述幾何矩形的定製結構體Rect
。這個例子同時定義了兩個輔助結構體Size
和Point
,它們都把0.0
作為所有屬性的默認值:
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
}
因為結構體Rect
提供了其所有屬性的默認值,所以正如默認構造器中描述的,它可以自動接受一個默認的構造器和一個成員級構造器。這些構造器可以用於構造新的Rect
實例:
let defaultRect = Rect()
let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0),
size: Size(width: 5.0, height: 5.0))
你可以提供一個額外的使用特殊中心點和大小的構造器來擴展Rect
結構體:
extension Rect {
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)
}
}
這個新的構造器首先根據提供的center
和size
值計算一個合適的原點。然後調用該結構體自動的成員構造器init(origin:size:)
,該構造器將新的原點和大小存到了合適的屬性中:
let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
size: Size(width: 3.0, height: 3.0))
// centerRect的原點是 (2.5, 2.5),大小是 (3.0, 3.0)
注意:
如果你使用擴展提供了一個新的構造器,你依舊有責任保證構造過程能夠讓所有實例完全初始化。