国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Swift > 正文

Swift學習筆記之構造器重載

2020-03-09 17:51:50
字體:
來源:轉載
供稿:網友
Swift 將為所有屬性已提供默認值的且自身沒有定義任何構造器的結構體或基類,提供一個默認的構造器。這個默認構造器將簡單的創建一個所有屬性值都設置為默認值的實例。
 

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

一、構造器重載概念

Swift中函數重載的條件也適用于構造器,條件如下:
函數有相同的名字;
參數列表不同或返回值類型不同,或外部參數名不同;
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)        ⑤
println("長方形:/(rectc1.width) x /(rectc1.height)")
var rectc2 = Rectangle(W : 320.0, H : 480.0)        ⑥
println("長方形:/(rectc2.width) x /(rectc2.height)")
var rectc3 = Rectangle(length: 500.0)        ⑦
println("長方形3:/(rectc3.width) x /(rectc3.height)")
var rectc4 = Rectangle()        ⑧
println("長方形4:/(rectc4.width) x /(rectc4.height)")

 

上述代碼第①~④行定義了4個構造器,其他是重載關系。從參數個數和參數類型上看,第①行和第②行的構造器是一樣的,但是它們的外部參數名不同,所以在第⑤行調用的是第①行的構造器,第⑥行調用的是第②行的構造器。
第③行和第④行的構造器參數個數與第①行不同,所以在第⑦行調用的是第③行的構造器,第④行調用的是第⑧行的構造器。

二、值類型構造器代理

為了減少多個構造器間的代碼重復,在定義構造器時,可以通過調用其他構造器來完成實例的部分構造過程,這個過程稱為構造器代理。構造器代理在值類型和引用類型中使用方式不同,本節我們先介紹值類型構造器代理。
將上一節的示例修改如下:

 

復制代碼代碼如下:

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("長方形:/(rectc1.width) x /(rectc1.height)")
var rectc2 = Rectangle(W : 320.0, H : 480.0)        ⑥
println("長方形:/(rectc2.width) x /(rectc2.height)")
var rectc3 = Rectangle(length: 500.0)        ⑦
println("長方形3:/(rectc3.width) x /(rectc3.height)")
var rectc4 = Rectangle()        ⑧
println("長方形4:/(rectc4.width) x /(rectc4.height)")

 

將Rectangle聲明為結構體類型,其中也有4個構造器重載。在第③行和第④行的構造器中使用了self.init語句,self指示當前實例本身,init是本身的構造器,第③行的self.init(W : length, H : length)語句是在調用第②行定義的構造器,第④行的self.init(width: 640.0, height: 940.0)語句是在調用第①行定義的構造器。
這種在同一個類型中通過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)        ⑤
println("長方形:/(rectc1.width) x /(rectc1.height)")
var rectc2 = Rectangle(W : 320.0, H : 480.0)        ⑥
println("長方形:/(rectc2.width) x /(rectc2.height)")
var rectc3 = Rectangle(length: 500.0)        ⑦
println("長方形3:/(rectc3.width) x /(rectc3.height)")
var rectc4 = Rectangle()        ⑧
println("長方形4:/(rectc4.width) x /(rectc4.height)")

 

將Rectangle聲明為類,其中也有4個構造器重載。在第③行和第④行的構造器中使用了self.init語句,并且在構造器前面加上了convenience關鍵字,convenience表示便利構造器,這說明我們定義構造器是橫向代理調用其他構造器。
第③行的self.init(W : length, H : length)語句是在橫向調用第②行定義的構造器代理,第④行的self.init(width: 640.0, height: 940.0)語句是在橫向調用第①行定義的構造器代理。

構造器重載的問題今天就到這里吧,小伙伴們可以參考下示例,希望對大家有所幫助



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 方城县| 丹阳市| 冕宁县| 合作市| 那坡县| 广平县| 华坪县| 江北区| 通辽市| 精河县| 霸州市| 临安市| 隆化县| 綦江县| 高密市| 嘉义市| 卓尼县| 炉霍县| 定襄县| 武陟县| 青海省| 万山特区| 武山县| 丹江口市| 北碚区| 堆龙德庆县| 教育| 枞阳县| 海晏县| 建阳市| 永新县| 太谷县| 舞阳县| 内丘县| 江口县| 渑池县| 汶川县| 仁寿县| 宣化县| 新巴尔虎左旗| 华阴市|