Swift構造器重載

與函數同樣,方法也存在重載,其重載的方式與函數一致。那麼做爲構造器的特殊方法,是否也存在重載呢?答案是確定的。
1、構造器重載概念
Swift中函數重載的條件也適用於構造器,條件以下:
函數有相同的名字;
參數列表不一樣或返回值類型不一樣,或外部參數名不一樣;
Swift中的構造器能夠知足如下兩個條件,代碼以下:
php

[html] view plaincopyhtml

  1. class Rectangle {  swift

  2.       

  3.     var width : Double  微信

  4.     var height : Double  函數

  5.       

  6.     init(width : Double, height : Double) { ①  網站

  7.         self.width   = width  spa

  8.         self.height  = height  .net

  9.     }  代理

  10.       

  11.     init(W width : Double,H height : Double) {  ②  orm

  12.         self.width   = width  

  13.         self.height  = height  

  14.     }  

  15.       

  16.     init(length : Double) { ③  

  17.         self.width   = length  

  18.         self.height  = length  

  19.     }  

  20.   

  21.   

  22.     init() {                        ④  

  23.         self.width   = 640.0  

  24.         self.height  = 940.0  

  25.     }  

  26.   

  27.   

  28. }  

  29.   

  30.   

  31. var rectc1 = Rectangle(width : 320.0, height : 480.0)   ⑤  

  32. println("長方形:\(rectc1.width) x \(rectc1.height)")  

  33.   

  34.   

  35. var rectc2 = Rectangle(W : 320.0, H : 480.0)    ⑥  

  36. println("長方形:\(rectc2.width) x \(rectc2.height)")  

  37.   

  38.   

  39. var rectc3 = Rectangle(length: 500.0)   ⑦  

  40. println("長方形3:\(rectc3.width) x \(rectc3.height)")  

  41.   

  42.   

  43. var rectc4 = Rectangle()    ⑧  

  44. println("長方形4:\(rectc4.width) x \(rectc4.height)")  



上述代碼第①~④行定義了4個構造器,其餘是重載關係。從參數個數和參數類型上看,第①行和第②行的構造器是同樣的,可是它們的外部參數名不一樣,因此在第⑤行調用的是第①行的構造器,第⑥行調用的是第②行的構造器。
第③行和第④行的構造器參數個數與第①行不一樣,因此在第⑦行調用的是第③行的構造器,第④行調用的是第⑧行的構造器。
2、值類型構造器代理
爲了減小多個構造器間的代碼重複,在定義構造器時,能夠經過調用其餘構造器來完成實例的部分構造過程,這個過程稱爲構造器代理。構造器代理在值類型和引用類型中使用方式不一樣,本節咱們先介紹值類型構造器代理。
將上一節的示例修改以下:

[html] view plaincopy

  1. struct Rectangle {  

  2.   

  3.   

  4.     var width : Double  

  5.     var height : Double  

  6.       

  7.     init(width : Double, height : Double) { ①  

  8.         self.width   = width  

  9.         self.height  = height  

  10.     }  

  11.       

  12.     init(W width : Double,H height : Double) {  ②  

  13.         self.width   = width  

  14.         self.height  = height  

  15.     }  

  16.       

  17.     init(length : Double) { ③  

  18.         self.init(W : length, H : length)  

  19.     }  

  20.   

  21.   

  22.     init() {                        ④  

  23.         self.init(width: 640.0, height: 940.0)  

  24.     }  

  25.   

  26.   

  27. }  

  28.   

  29.   

  30. var rectc1 = Rectangle(width : 320.0, height : 480.0)   ⑤  

  31. println("長方形:\(rectc1.width) x \(rectc1.height)")  

  32.   

  33.   

  34. var rectc2 = Rectangle(W : 320.0, H : 480.0)    ⑥  

  35. println("長方形:\(rectc2.width) x \(rectc2.height)")  

  36.   

  37.   

  38. var rectc3 = Rectangle(length: 500.0)   ⑦  

  39. println("長方形3:\(rectc3.width) x \(rectc3.height)")  

  40.   

  41.   

  42. var rectc4 = Rectangle()    ⑧  

  43. 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語句進行調用就是咱們說的構造器代理。
3、引用類型構造器橫向代理
引用類型構造器代理就是類構造器代理。因爲類有繼承關係,類構造器代理比較複雜,分爲橫向代理和向上代理。
橫向代理相似於值類型構造器代理,發生在同一類內部,這種構造器稱爲便利構造器(convenience initializers)。
向上代理髮生在繼承狀況下,在子類構造過程當中要先調用父類構造器,初始化父類的存儲屬性,這種構造器稱爲指定構造器(designated initializers)。
因爲咱們尚未介紹繼承,所以本章只介紹橫向代理。
將上一節的示例修改以下:

[html] view plaincopy

  1. class Rectangle {  

  2.   

  3.   

  4.     var width : Double  

  5.     var height : Double  

  6.       

  7.     init(width : Double, height : Double) { ①  

  8.         self.width   = width  

  9.         self.height  = height  

  10.     }  

  11.       

  12.     init(W width : Double,H height : Double) {  ②  

  13.         self.width   = width  

  14.         self.height  = height  

  15.     }  

  16.       

  17.     convenience init(length : Double) { ③  

  18.         self.init(W : length, H : length)  

  19.     }  

  20.   

  21.   

  22.     convenience init() {    ④  

  23.         self.init(width: 640.0, height: 940.0)  

  24.     }  

  25.   

  26.   

  27. }  

  28.   

  29.   

  30. var rectc1 = Rectangle(width : 320.0, height : 480.0)   ⑤  

  31. println("長方形:\(rectc1.width) x \(rectc1.height)")  

  32.   

  33.   

  34. var rectc2 = Rectangle(W : 320.0, H : 480.0)    ⑥  

  35. println("長方形:\(rectc2.width) x \(rectc2.height)")  

  36.   

  37.   

  38. var rectc3 = Rectangle(length: 500.0)   ⑦  

  39. println("長方形3:\(rectc3.width) x \(rectc3.height)")  

  40.   

  41.   

  42. var rectc4 = Rectangle()    ⑧  

  43. 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圖書《Swift開發指南》

本書交流討論網站:http://www.51work6.com/swift.php

歡迎加入Swift技術討論羣:362298485

歡迎關注智捷iOS課堂微信公共平臺

相關文章
相關標籤/搜索