что за противоречивость языка, в документации написано что инициализаторы(конструкторы) не наследуются, но они наследуются

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() выдаст ошибку.

→ Ссылка