что за противоречивость языка, в документации написано что инициализаторы(конструкторы) не наследуются, но они наследуются
class Food {
var name: String
init (_ name : String) {
self.name = name
}
convenience init() {
self.init("Unnamed")
}
}
class RecipeIngredient: Food {
var quantity: Int
init(_ name : String,_ quantity : Int) {
self.quantity = quantity
super.init(name)
}
override convenience init(_ name : String) {
self.init(name, 1)
}
}
let oneMysteryItem = RecipeIngredient()
print(oneMysteryItem.quantity)
Ответы (1 шт):
Автор решения: Oleg Soloviev
→ Ссылка
Если подкласс имеет собственный назначенный инициализатор (в вашем примере это init(_ name : String,_ quantity : Int)), то инициализаторы родительского класса не наследуются. Если подкласс переопределяет все назначенные инициализаторы суперкласса (override convenience init), то он наследует и все его вспомогательные инициализаторы (convenience init).
Именно поэтому у вас срабатывает init() из Food:
let oneMysteryItem = RecipeIngredient()
print(oneMysteryItem.quantity) // 1
print(oneMysteryItem.name) // Unnamed
Но если вы уберете из RecipeIngredient
override convenience init(_ name : String) {
self.init(name, 1)
}
То init() из Food уже не наследуется и строка let oneMysteryItem = RecipeIngredient() выдаст ошибку.