擴展類型的時候,也可以添加新的構造函數。值類型與引用類型擴展有所區別。值類型包括了除類以外的其他類型,主要是枚舉類型和結構體類型。
值類型擴展構造函數
擴展結構體類型中定義構造函數的示例:
struct Rectangle {
var width : Double
var height : Double
init(width : Double, height : Double) {
self.width = width
self.height = height
}
}
extension Rectangle { //定義了Rectangle的擴展類型
init(length : Double) {
self.init(width : length, height :length)
}
}
var rect = Rectangle(width: 320.0, height : 480.0) //調用兩個參數的構造函數,這個構造函數是原始類型提供,Rectangle類型已經是擴展類型
print("長方形:\(rect.width)x \(rect.height)")
var square =Rectangle(length: 500.0) //調用一個參數的構造函數,這個構造函數是擴展類型提供的
print("正方形:\(square.width)x \(square.height)")
self.init是調用了原始類型的兩個參數的構造函數。
引用類型擴展構造函數
擴展類中定義構造函數的示例:
class Person {
var name : String
var age : Int
func description() -> String {
return "\(name) 年齡是: \(age)"
}
init (name : String, age : Int) {
self.name = name
self.age = age
}
}
extension Person { //定義Person類的擴展類型
convenience init (name : String) { //便利構造函數
self.init(name : name, age : 8)
}
}
let p1 = Person(name :"Mary") //調用兩個參數的構造函數,這個構造函數是原始類型提供,這時候的Person類型已經是擴展類型。
print("Person1 : \(p1.description())")
let p2 = Person(name :"Tony", age : 28)//調用一個參數的構造函數創建Person實例,這個構造函數是擴展類型提供的。
print("Person2 : \(p2.description())")
代碼self.init(name :name, age : 8)調用指定構造函數代理部分構造任務。