麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Swift > 正文

Swift學(xué)習(xí)筆記之構(gòu)造器重載

2020-03-09 17:51:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
Swift 將為所有屬性已提供默認(rèn)值的且自身沒(méi)有定義任何構(gòu)造器的結(jié)構(gòu)體或基類,提供一個(gè)默認(rèn)的構(gòu)造器。這個(gè)默認(rèn)構(gòu)造器將簡(jiǎn)單的創(chuàng)建一個(gè)所有屬性值都設(shè)置為默認(rèn)值的實(shí)例。
 

與函數(shù)一樣,方法也存在重載,其重載的方式與函數(shù)一致。那么作為構(gòu)造器的特殊方法,是否也存在重載呢?答案是肯定的。

一、構(gòu)造器重載概念

Swift中函數(shù)重載的條件也適用于構(gòu)造器,條件如下:
函數(shù)有相同的名字;
參數(shù)列表不同或返回值類型不同,或外部參數(shù)名不同;
Swift中的構(gòu)造器可以滿足以下兩個(gè)條件,代碼如下:

 

復(fù)制代碼代碼如下:

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é)的示例修改如下:

 

復(fù)制代碼代碼如下:

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é)的示例修改如下:

 

復(fù)制代碼代碼如下:

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)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 日韩精品久久久久久 | 亚洲精品wwww | 1区2区3区在线观看 欧美特黄a | 亚洲影视在线观看 | 黄色免费av网站 | 国产女厕一区二区三区在线视 | 成人激情视频网 | 欧美一级成人 | 久色亚洲 | 嗯~啊~弄嗯~啊h高潮视频 | 久久久精品视频免费看 | 日本一区二区免费在线观看 | 国产精品av久久久久久久久久 | 成人不卡免费视频 | 好吊色欧美一区二区三区四区 | 久久久久久久91 | 欧美一级高潮 | 神秘电影91 | 加勒比综合 | 免费国产视频在线观看 | 毛片一区二区三区四区 | 香蕉国产精品 | 国产免费片 | 成年免费网站 | 国产1区视频 | 嗯~啊~弄嗯~啊h高潮视频 | 人成免费a级毛片 | 日韩伦理电影免费观看 | 蜜桃视频日韩 | 久综合色| 美国av免费看 | 日韩av在线播放一区 | 亚洲天堂在线电影 | 日韩视频一区二区在线观看 | 久久久精品网站 | 久久久久久免费 | 久久精品2019中文字幕 | 欧美成人免费tv在线播放 | 得得啪在线视频 | 天天碰夜夜操 | 一级做a爱片性色毛片 |