構造函數作為一種特殊方法,也可以重載。
Swift中構造函數可以多個,他們參數列表和返回值可以不同,這些構造函數構成重載。
示例代碼如下:
class Rectangle {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
init(W width: Double,H height: Double){
self.width = width
self.height = height
}
init(length: Double) {
self.width = length
self.height = length
}
init() {
self.width = 640.0
self.height = 940.0
}
}
var rectc1 =Rectangle(width: 320.0, height: 480.0)
print("長方形:\(rectc1.width) x\(rectc1.height)")
var rectc2 = Rectangle(W: 320.0, H: 480.0)
print("長方形:\(rectc2.width) x\(rectc2.height)")
var rectc3 =Rectangle(length: 500.0)
print("長方形3:\(rectc3.width) x\(rectc3.height)")
var rectc4 = Rectangle()
print("長方形4:\(rectc4.width) x\(rectc4.height)")
構造函數代理
為了減少多個構造函數間的代碼重復,在定義構造函數時,可以通過調用其他構造函數來完成實例的部分構造過程,這個過程稱為構造函數代理。構造函數代理在結構體和類中使用方式是不同,先介紹結構體中構造函數代理。
將上一節的示例修改如下:
struct Rectangle {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
init(W width: Double,H height: Double){
self.width = width
self.height = height
}
init(length: Double) { //調用了self.init語句
self.init(W: length, H: length)
}
init() { //調用了self.init語句
self.init(width: 640.0, height: 940.0)
}
}
var rectc1 =Rectangle(width: 320.0, height: 480.0)
print("長方形:\(rectc1.width) x\(rectc1.height)")
var rectc2 = Rectangle(W: 320.0, H: 480.0)
print("長方形:\(rectc2.width) x\(rectc2.height)")
var rectc3 =Rectangle(length: 500.0)
print("長方形3:\(rectc3.width) x\(rectc3.height)")
var rectc4 = Rectangle()
print("長方形4:\(rectc4.width) x \(rectc4.height)")
將Rectangle聲明為結構體類型,其中也有4個構造函數重載。
這種在同一個類型中通過self.init語句進行調用當前類型其它構造函數,其它構造函數被稱為構造函數代理。
類構造函數橫向代理
由於類有繼承關系,類構造函數代理比較復雜,分為橫向代理和向上代理。
橫向代理類似於結構體類型構造函數代理,發生在同一類內部,這種構造函數稱為便利構造函數(convenience initializers)。
向上代理發生在繼承情況下,在子類構造過程中要先調用父類構造函數,初始化父類的存儲屬性,這種構造函數稱為指定構造函數(designated initializers)。
將上面的示例修改如下:
class Rectangle {
var width: Double
var height: Double
init(width: Double, height: Double){
self.width = width
self.height = height
}
init(W width: Double,H height: Double){
self.width = width
self.height = height
}
convenience init(length: Double) {
self.init(W: length, H: length)
}
convenience init() {
self.init(width: 640.0, height: 940.0)
}
}
var rectc1 =Rectangle(width: 320.0, height: 480.0)
print("長方形:\(rectc1.width) x\(rectc1.height)")
var rectc2 = Rectangle(W: 320.0, H: 480.0)
print("長方形:\(rectc2.width) x\(rectc2.height)")
var rectc3 =Rectangle(length: 500.0)
print("長方形3:\(rectc3.width) x\(rectc3.height)")
var rectc4 = Rectangle()
print("長方形4:\(rectc4.width) x\(rectc4.height)")
將Rectangle聲明為類,其中也有4個構造函數重載。