Может ли convenience-инициализатор в Swift вызывать инициализатор суперкласса (super.init)?

«Может ли convenience-инициализатор в Swift вызывать инициализатор суперкласса (super.init)?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, не может. Это прямое ограничение языка Swift.

  • Designated (назначенные) инициализаторы обязаны обеспечивать полную инициализацию своего класса и вызывать инициализатор суперкласса.
  • Convenience (вспомогательные) инициализаторы предназначены для предоставления альтернативных точек входа для инициализации текущего класса. Они могут вызывать только другие инициализаторы того же класса (обычно designated), делегируя им основную работу.

Пример, иллюстрирующий правило:

class Vehicle {
    let wheels: Int
    init(wheels: Int) { self.wheels = wheels } // Designated инициализатор
}

class Car: Vehicle {
    let brand: String

    // Designated инициализатор подкласса
    init(brand: String, wheels: Int) {
        self.brand = brand
        super.init(wheels: wheels) // ✅ Вызов super разрешен только здесь
    }

    // Convenience инициализатор
    convenience init(brand: String) {
        self.init(brand: brand, wheels: 4) // ✅ Вызов designated инициализатора своего класса
        // super.init(wheels: 4) // ❌ Ошибка компиляции: convenience не может вызывать super
    }
}