我有以下示例和一個問題:
我知道初始化程式在某些情況下是繼承的。
class Food{
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "[unnamed]")
}
}
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int){
self.quantity = quantity
super.init(name: name)
}
override convenience init(name: String){
self.init(name: name, quantity: 1)
}
}
let mystery = RecipeIngredient() // Why does this work?
我原以為沒有任何引數的初始化不起作用,因為便利初始化程式僅在基類中宣告并且不設定數量屬性。
顯然它無論如何都有效。但為什么?當我在沒有任何引數的情況下呼叫(至少在子類中不存在的)初始化程式時,后臺會發生什么?
uj5u.com熱心網友回復:
子類中定義了初始化器和超類的初始化器(當然,除非它們中的任何一個在子類中被覆寫)。所以在這種情況下,有 3 個 initRecipeIngredient
從 RecipeIngredient
init(name: String, quantity: Int){
self.quantity = quantity
super.init(name: name)
}
override convenience init(name: String){
self.init(name: name, quantity: 1)
}
還有一個來自 Food
convenience init() {
self.init(name: "[unnamed]")
}
現在一個便利的 init 必須直接或通過另一個便利的 init 呼叫一個默認的 init,所以這里的呼叫鏈變成
Food.init() -> RecipeIngredient.init(name:) -> RecipeIngredient(name:quantity) -> Food.init(name:)
這可以通過添加print(#function)到每個 init 來很容易地看到,它給出了輸出
let mystery = RecipeIngredient()
初始化()
初始化(名稱:)
初始化(名稱:數量:)
初始化(名稱:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/416303.html
標籤:
下一篇:基于嵌套陣列swift過濾陣列
