您好,登錄后才能下訂單哦!
原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)注明:關(guān)東升的博客
在構(gòu)造函數(shù)中可以使用構(gòu)造函數(shù)代理幫助完成部分構(gòu)造工作。類構(gòu)造函數(shù)代理分為橫向代理和向上代理,橫向代理只能在發(fā)生在同一類內(nèi)部,這種構(gòu)造函數(shù)稱為便利構(gòu)造函數(shù)。向上代理發(fā)生在繼承的情況下,在子類構(gòu)造過(guò)程中,要先調(diào)用父類構(gòu)造函數(shù)初始化父類的存儲(chǔ)屬性,這種構(gòu)造函數(shù)稱為指定構(gòu)造函數(shù)。
構(gòu)造函數(shù)調(diào)用規(guī)則
Person和Student類示例:
class Person { var name: String var age: Int func description() -> String { return "\(name) 年齡是: \(age)" } convenience init () { //便利構(gòu)造函數(shù) self.init(name: "Tony") self.age = 18 } convenience init (name: String) {//便利構(gòu)造函數(shù) self.init(name: name, age: 18) } init (name: String, age: Int){ //指定構(gòu)造函數(shù) self.name = name self.age = age } } class Student: Person { var school: String init (name: String, age: Int,school: String) { //指定構(gòu)造函數(shù) self.school = school super.init(name: name, age: age) } convenienceoverride init (name: String,age: Int) {//便利構(gòu)造函數(shù) self.init(name: name, age: age, school: "清華大學(xué)") } } let student = Student() print("學(xué)生: \(student.description())")
構(gòu)造函數(shù)之間的調(diào)用形成了構(gòu)造函數(shù)鏈,如圖所示。
Swift限制構(gòu)造函數(shù)之間的代理調(diào)用的規(guī)則有3條,如下所示。
指定構(gòu)造函數(shù)必須調(diào)用其直接父類的的指定構(gòu)造函數(shù)。從圖可見,Student中的④號(hào)指定構(gòu)造函數(shù)調(diào)用Person中的③號(hào)指定構(gòu)造函數(shù)。
便利構(gòu)造函數(shù)必須調(diào)用同一類中定義的其他構(gòu)造函數(shù)。從圖可見,Student中的⑤號(hào)便利構(gòu)造函數(shù)調(diào)用同一類中的④號(hào)便利構(gòu)造函數(shù),Person中的①號(hào)便利構(gòu)造函數(shù)調(diào)用同一類中的②號(hào)便利構(gòu)造函數(shù)。
便利構(gòu)造函數(shù)必須最終以調(diào)用一個(gè)指定構(gòu)造函數(shù)結(jié)束。從圖可見,Student中的⑤號(hào)便利構(gòu)造函數(shù)調(diào)用同一類中的④號(hào)指定構(gòu)造函數(shù),Person中的②號(hào)便利構(gòu)造函數(shù)調(diào)用同一類中的③號(hào)指定構(gòu)造函數(shù)。
歡迎關(guān)注關(guān)東升新浪微博@tony_關(guān)東升。
關(guān)注智捷課堂微信公共平臺(tái),了解最新技術(shù)文章、圖書、教程信息
更多精品iOS、Cocos、移動(dòng)設(shè)計(jì)課程請(qǐng)關(guān)注智捷課堂官方網(wǎng)站:http://www.zhijieketang.com
智捷課堂論壇網(wǎng)站:http://51work6.com/forum.php
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。