位置:首頁 > 高級語言 > Swift教學 > Swift構造器

Swift構造器

構造器(Initializers)

擴展可以向已有類型添加新的構造器。這可以讓你擴展其它類型,將你自己的定製類型作為構造器參數,或者提供該類型的原始實現中冇有包含的額外初始化選項。

擴展能向類中添加新的便利構造器,但是它們不能向類中添加新的指定構造器或析構函數。指定構造器和析構函數必須總是由原始的類實現來提供。


注意:
如果你使用擴展向一個值類型添加一個構造器,該構造器向所有的存儲屬性提供默認值,而且冇有定義任何定製構造器(custom initializers),那麼對於來自你的擴展構造器中的值類型,你可以調用默認構造器(default initializers)和逐一成員構造器(memberwise initializers)。
正如在值類型的構造器授權中描述的,如果你已經把構造器寫成值類型原始實現的一部分,上述規則不再適用。
 

下麵的例子定義了一個用於描述幾何矩形的定製結構體Rect。這個例子同時定義了兩個輔助結構體SizePoint,它們都把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)
    }
}

這個新的構造器首先根據提供的centersize值計算一個合適的原點。然後調用該結構體自動的成員構造器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)


注意:
如果你使用擴展提供了一個新的構造器,你依舊有責任保證構造過程能夠讓所有實例完全初始化。