深刻理解代替單純記憶安全
Swift初始化時會想盡一切辦法確保初始化的安全、完備bash
就兩種初始化方法:designated initializer
和convenience initializer
ide
designated
方法是指當前類完成初始化最基礎的方法,它能知足全部stored property的初始化賦值ui
初始化方法中必須保證全部stored property
都被賦上初始值。固然,optional
的屬性能夠不用明顯的寫出,默認會賦值爲nilspa
Swift初始化方法,子類通常不會將父類的方法繼承下來。爲的就是,一旦能夠繼承的話,那咱們就能夠用父類的方法初始化一個子類對象了,此時子類的對象的屬性可能並不okcode
class Food {
var name: String
init(name: String) {
self.name = name
}
}
class Noodle: Food {
let width: CGFloat
init(width: CGFloat) {
self.width = width
super.init(name: "Noodle")
}
}
複製代碼
固然,上面所說是指通常狀況,有些狀況下子類仍是會繼承父類的方法的cdn
designated initializer
時,哪怕並子類並無增長stored property
的狀況下,依然不能繼承父類初始化方法。由於自定義initializer
初始化方法中除了爲stored property
賦值,可能還有其餘自定義操做,既然寫了designated initializer
方法,就說明可能有本身的實現,此時再繼承了父類的實現就觸發4中的問題了class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "unknown")
}
}
class Noodle: Food {
}
let var1 = Noodle()
let var2 = Noodle(name: "noddle")
複製代碼
一個複雜點的例子對象
designated initializer
,又重寫了一個父類的designated initializer
同時用做convenience initializer
convenience init()
方法會自動繼承到子類中,由於子類實現了全部的的父類的designated initializer
,因此父類的convenience initializer
自動繼承下來仍然會保證初始化的完備性接着上面的例子,再來一層blog
purchased
屬性有默認值,因此會自動繼承父類的各類初始化方法,由於繼承下來不會影響初始化的完備性仍是那句話,爲了確保初始化的完備性,能繼承下去的就繼承,一旦發現有影響完備性的漏洞,就不容許繼承繼承
convenience initializer
只能訪問本類的初始化方法爲此目的designated initializer
只能執行父類的designated initializer
也是如此override
,這點不是很理解