Swift學(xué)習(xí)筆記之構(gòu)造器重載
與函數(shù)一樣,方法也存在重載,其重載的方式與函數(shù)一致。那么作為構(gòu)造器的特殊方法,是否也存在重載呢?答案是肯定的。
一、構(gòu)造器重載概念
Swift中函數(shù)重載的條件也適用于構(gòu)造器,條件如下:
函數(shù)有相同的名字;
參數(shù)列表不同或返回值類型不同,或外部參數(shù)名不同;
Swift中的構(gòu)造器可以滿足以下兩個(gè)條件,代碼如下:
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) ⑤
println("長(zhǎng)方形:\(rectc1.width) x \(rectc1.height)")
var rectc2 = Rectangle(W : 320.0, H : 480.0) ⑥
println("長(zhǎng)方形:\(rectc2.width) x \(rectc2.height)")
var rectc3 = Rectangle(length: 500.0) ⑦
println("長(zhǎng)方形3:\(rectc3.width) x \(rectc3.height)")
var rectc4 = Rectangle() ⑧
println("長(zhǎng)方形4:\(rectc4.width) x \(rectc4.height)")
上述代碼第①~④行定義了4個(gè)構(gòu)造器,其他是重載關(guān)系。從參數(shù)個(gè)數(shù)和參數(shù)類型上看,第①行和第②行的構(gòu)造器是一樣的,但是它們的外部參數(shù)名不同,所以在第⑤行調(diào)用的是第①行的構(gòu)造器,第⑥行調(diào)用的是第②行的構(gòu)造器。
第③行和第④行的構(gòu)造器參數(shù)個(gè)數(shù)與第①行不同,所以在第⑦行調(diào)用的是第③行的構(gòu)造器,第④行調(diào)用的是第⑧行的構(gòu)造器。
二、值類型構(gòu)造器代理
為了減少多個(gè)構(gòu)造器間的代碼重復(fù),在定義構(gòu)造器時(shí),可以通過(guò)調(diào)用其他構(gòu)造器來(lái)完成實(shí)例的部分構(gòu)造過(guò)程,這個(gè)過(guò)程稱為構(gòu)造器代理。構(gòu)造器代理在值類型和引用類型中使用方式不同,本節(jié)我們先介紹值類型構(gòu)造器代理。
將上一節(jié)的示例修改如下:
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(W : length, H : length)
}
init() { ④
self.init(width: 640.0, height: 940.0)
}
}
var rectc1 = Rectangle(width : 320.0, height : 480.0) ⑤
println("長(zhǎng)方形:\(rectc1.width) x \(rectc1.height)")
var rectc2 = Rectangle(W : 320.0, H : 480.0) ⑥
println("長(zhǎng)方形:\(rectc2.width) x \(rectc2.height)")
var rectc3 = Rectangle(length: 500.0) ⑦
println("長(zhǎng)方形3:\(rectc3.width) x \(rectc3.height)")
var rectc4 = Rectangle() ⑧
println("長(zhǎng)方形4:\(rectc4.width) x \(rectc4.height)")
將Rectangle聲明為結(jié)構(gòu)體類型,其中也有4個(gè)構(gòu)造器重載。在第③行和第④行的構(gòu)造器中使用了self.init語(yǔ)句,self指示當(dāng)前實(shí)例本身,init是本身的構(gòu)造器,第③行的self.init(W : length, H : length)語(yǔ)句是在調(diào)用第②行定義的構(gòu)造器,第④行的self.init(width: 640.0, height: 940.0)語(yǔ)句是在調(diào)用第①行定義的構(gòu)造器。
這種在同一個(gè)類型中通過(guò)self.init語(yǔ)句進(jìn)行調(diào)用就是我們說(shuō)的構(gòu)造器代理。
三、引用類型構(gòu)造器橫向代理
引用類型構(gòu)造器代理就是類構(gòu)造器代理。由于類有繼承關(guān)系,類構(gòu)造器代理比較復(fù)雜,分為橫向代理和向上代理。
橫向代理類似于值類型構(gòu)造器代理,發(fā)生在同一類內(nèi)部,這種構(gòu)造器稱為便利構(gòu)造器(convenience initializers)。
向上代理發(fā)生在繼承情況下,在子類構(gòu)造過(guò)程中要先調(diào)用父類構(gòu)造器,初始化父類的存儲(chǔ)屬性,這種構(gòu)造器稱為指定構(gòu)造器(designated initializers)。
由于我們還沒(méi)有介紹繼承,因此本章只介紹橫向代理。
將上一節(jié)的示例修改如下:
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) ⑤
println("長(zhǎng)方形:\(rectc1.width) x \(rectc1.height)")
var rectc2 = Rectangle(W : 320.0, H : 480.0) ⑥
println("長(zhǎng)方形:\(rectc2.width) x \(rectc2.height)")
var rectc3 = Rectangle(length: 500.0) ⑦
println("長(zhǎng)方形3:\(rectc3.width) x \(rectc3.height)")
var rectc4 = Rectangle() ⑧
println("長(zhǎng)方形4:\(rectc4.width) x \(rectc4.height)")
將Rectangle聲明為類,其中也有4個(gè)構(gòu)造器重載。在第③行和第④行的構(gòu)造器中使用了self.init語(yǔ)句,并且在構(gòu)造器前面加上了convenience關(guān)鍵字,convenience表示便利構(gòu)造器,這說(shuō)明我們定義構(gòu)造器是橫向代理調(diào)用其他構(gòu)造器。
第③行的self.init(W : length, H : length)語(yǔ)句是在橫向調(diào)用第②行定義的構(gòu)造器代理,第④行的self.init(width: 640.0, height: 940.0)語(yǔ)句是在橫向調(diào)用第①行定義的構(gòu)造器代理。
構(gòu)造器重載的問(wèn)題今天就到這里吧,小伙伴們可以參考下示例,希望對(duì)大家有所幫助
相關(guān)文章
Swift中Optional值的鏈?zhǔn)秸{(diào)用學(xué)習(xí)筆記
這篇文章主要介紹了Swift中Optional值的鏈?zhǔn)秸{(diào)用學(xué)習(xí)筆記,Optional鏈?zhǔn)荢wift入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-07-07Swift?Error重構(gòu)的基礎(chǔ)示例詳解
這篇文章主要為大家介紹了Swift?Error基礎(chǔ)錯(cuò)誤處理的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Swift3.0剪切板代碼拷貝及跨應(yīng)用粘貼實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Swift3.0剪切板代碼拷貝及跨應(yīng)用粘貼的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Swift編程中用以管理內(nèi)存的自動(dòng)引用計(jì)數(shù)詳解
這篇文章主要介紹了Swift編程中用以管理內(nèi)存的自動(dòng)引用計(jì)數(shù)詳解,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體
最近在學(xué)swift 3.0,主要看的是蘋果的官方文檔,這里只是根據(jù)自己看官方文檔的理解所做的一些記錄,不是完整的翻譯,希望也對(duì)你有所幫助。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-03-03Swift的開發(fā)環(huán)境搭建以及基本語(yǔ)法詳解
這篇文章主要介紹了Swift的開發(fā)環(huán)境搭建以及基本語(yǔ)法詳解,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11iOS中Swift指觸即開集成Touch ID指紋識(shí)別功能的方法
隨著移動(dòng)支付時(shí)代的到來(lái),Touch ID 指紋驗(yàn)證迅速被支付寶,微信錢包普及,相信各位朋友使用后也大呼方便。下面給大家分享iOS中Swift指觸即開集成Touch ID指紋識(shí)別功能的方法,一起看看吧2017-03-03