Ответ
Нет, не может. Это прямое ограничение языка 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
}
}