您好,登錄后才能下訂單哦!
在構造器中可以使用構造代理器來完成部分構造工作,類構造器代理分為橫向代理和向上代理,橫向代理只能發生在同一類內部,這種構造器稱為便利構造器,向上代理發生在繼承的情況下,在子類構造過程中,要先調用父類構造器初始化父類的存儲屬性,這種構造器稱為指定構造器
一、構造器調用規則
1、指定的構造器必須調用其直接父類的指定構造器;
2、便利構造器必須調用其同一類中的其他構造器;
3、便利構造器必須最終調用一個指定構造器結束;
class person { var name:String var age : Int func description()->String { return "\(name):\(age)" } convenienece init(){ self.init(name:"HEHE") self.age=10 } convenience init(name:String){ self.init(name:name,age:10) } init(name:String,age:Int){ self.name=name self.age=age }
class Studetn:Person { var school:String init(name:String,age:Int,school:String){ self.school=school super.init(name:name,age:age) } convenienece override init(name:String,age:Int){ self.init(name:name,age:age,school:"XXXX") } }
二、構造過程安全檢查
1、首先分配內存,初始化子類存儲屬性,沿構造器鏈向上初始化父類存儲屬性,到達構造器鏈頂部,初始化全部的存儲屬性;
2、從頂部構造鏈往下,可以對類進行進一步的修改存儲屬性,調用實例方法等處理;
Swift的編譯器在構造過程中可以運行一些安全檢查工作,這些工作可以有效的防止屬性在初始化前被訪問,也可以防止屬性被其它的一些構造器賦予不同的值;
安全檢查1:指定構造器必須保證其所在類的所有存儲屬性都初始化完成,之后才能向上調用父類構造器代理;
安全檢查2:指定構造器必須先調用父類構造器代理,再為繼承的屬性賦予新值,否則指定構造器賦予的新值都會被父類中的構造器所覆蓋;
安全檢查3:便利構造器必須先調用同一類中的其他構造器代理,然后再為任意屬性賦新值,否則便利構造器賦予的值將被同一類中的其他指定構造器所覆蓋;
安全檢查4:構造器在第一階段構造完成之前,不能調用實例方法,也不能讀取實例屬性;
三、構造器繼承
Swift中子類構造器的來源有2種,自己編寫和從父類繼承,并不是所有父類的構造器都能自動繼承下來,能夠從父類自動繼承下來的構造器,規則如下:
1、如果子類沒有定義任何指定構造器,它將自動繼承父類的所有指定構造器;
2、如果子類提供了所有父類指定構造器的實現,無論是通過條件1繼承而來,還是自己編寫,它將自動繼承所有父類的便利構造器;
class Graduate:Studetn {
var special:String = ""
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。