Sobes.tech
Назад к вопросам
Junior — Middle
80

Возможно ли вызвать метод super в конструкторе convenience initializer в Swift?

Ответ от нейросети

sobes.tech AI

В Swift вызов super.init в конструкторе convenience initializer невозможен напрямую. По правилам инициализации в Swift, convenience инициализаторы должны вызывать другой инициализатор того же класса, а не инициализатор суперкласса.

Только designated initializer (основной инициализатор) может вызвать super.init. Таким образом, convenience инициализатор должен сначала вызвать designated инициализатор своего класса, а тот уже вызовет super.init.

Пример:

class Parent {
    init() {
        print("Parent init")
    }
}

class Child: Parent {
    override init() {
        super.init() // вызов суперкласса в designated инициализаторе
        print("Child designated init")
    }

    convenience init(param: Int) {
        self.init() // вызов designated инициализатора своего класса
        print("Child convenience init with param \(param)")
    }
}

let c = Child(param: 5)

Здесь convenience init вызывает self.init(), а уже self.init() вызывает super.init().