Swift-init初始化方法

相比較Objective-C而言,Swift的init初始化方法有三種Designated,Convenience和Required三種形式.類初始化有三個規(guī)則:
①指定的初始化方法必須從其直接父類調(diào)用一個指定的初始化方法.
②便利構(gòu)造方法必須調(diào)用同一類中定義的其他初始化方法.
③便利構(gòu)造方法必須最終會調(diào)用指定的初始化器.

FlyElephant.png

定義Teacher類:
<pre><code>`import UIKit

class Teacher {

var name:String = ""

init(name:String) {
    self.name = name
}

convenience init() {
    self.init(name: "Teacher")
}

}`</code></pre>

Student子類實現(xiàn):
<pre><code>`class Student: Teacher {

var score:String = ""

// 指定構(gòu)造方法
init(name: String,score: String) {
    self.score = score
    super.init(name: name)
}
// 便利構(gòu)造方法調(diào)用指定初始化方法
 convenience override init(name: String) {
    self.init(name:"",score:"")
}

}`</code></pre>

Swift中的類初始化分為兩個階段:
①每一個存儲屬性都由引入它的類分配一個初始值,確定了每個存儲屬性的初始狀態(tài).
②每個類中實例準(zhǔn)備返回之前,進一步更新其存儲的屬性.

兩階段初始化過程使初始化變得安全,同時也給類層次結(jié)構(gòu)中的每個類提供了完全的靈活性。兩階段初始化防止屬性值在初始化前被訪問,并防止屬性值被另一初始化器設(shè)置為不同的值。

Swift編譯過程會進行安全檢查:
①指定構(gòu)造器必須要確保所有被類中提到的屬性在向上調(diào)用父類的指定構(gòu)造器前被初始化,之后才能將其他構(gòu)造任務(wù)移交給父類的中的構(gòu)造器.

②指定構(gòu)造器必須先向上調(diào)用父類中的構(gòu)造器,才能為繼承自父類的屬性賦值.

③便利構(gòu)造器必須線調(diào)用同一個類中的其他構(gòu)造器,再為屬性賦值.

④構(gòu)造器完成之前不能調(diào)用其他任何實例方法,不能讀取實例屬性的值.

FlyElephant.png

對于子類中一定實現(xiàn)的 designated 初始化方法,可以通過required 關(guān)鍵字進行限制,強制子類重寫實現(xiàn).
<pre><code>`class Teacher {

var name:String = ""

required init(name:String) {
    //self.name = name
}

convenience init() {
    self.init(name: "Teacher")
}

}`</code></pre>

<pre><code>`class Student: Teacher {

var score:String = ""

// 指定構(gòu)造方法
init(name: String,score: String) {
    self.score = ""
    super.init(name: name)

}

required init(name: String) {
    super.init(name: name)
}

}`</code></pre>

參考資料
Apple官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容