《從零開始學Swift》學習筆記(Day 39)——建構函式過載

智捷關東昇發表於2016-03-21

原創文章,歡迎轉載。轉載請註明:關東昇的部落格

  建構函式作為一種特殊方法,也可以過載。
  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個建構函式過載。

歡迎關注關東昇新浪微博@tony_關東昇。 關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程資訊

enter image description here

更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com 智捷課堂論壇網站:http://51work6.com/forum.php

相關文章