原創文章,歡迎轉載。轉載請註明:關東昇的博客 php
構造函數做爲一種特殊方法,也能夠重載。java
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)")
構造函數代理網站
爲了減小多個構造函數間的代碼重複,在定義構造函數時,能夠經過調用其餘構造函數來完成實例的部分構造過程,這個過程稱爲構造函數代理。構造函數代理在結構體和類中使用方式是不一樣,先介紹結構體中構造函數代理。spa
將上一節的示例修改以下:.net
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語句進行調用當前類型其它構造函數,其它構造函數被稱爲構造函數代理。代理
類構造函數橫向代理code
因爲類有繼承關係,類構造函數代理比較複雜,分爲橫向代理和向上代理。
橫向代理相似於結構體類型構造函數代理,發生在同一類內部,這種構造函數稱爲便利構造函數(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_ 關東昇。
關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息
更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php