Что такое required init в Swift?

«Что такое required init в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Модификатор required указывает, что данный designated инициализатор должен быть реализован всеми прямыми подклассами данного класса. Это гарантирует наличие определённого интерфейса инициализации в иерархии наследования.

Основные случаи использования:

  1. Когда класс соответствует протоколу, который требует определённый инициализатор.
  2. Когда родительский класс сам определяет контракт, который должны выполнять все наследники.

Пример:

class Vehicle {
    var wheels: Int
    // Все подклассы Vehicle обязаны реализовать этот инициализатор.
    required init(wheels: Int) {
        self.wheels = wheels
    }
}

class Car: Vehicle {
    var brand: String

    init(brand: String) {
        self.brand = brand
        super.init(wheels: 4)
    }

    // Требуется компилятором. Даже если есть свои инициализаторы.
    required init(wheels: Int) {
        self.brand = "Unknown"
        super.init(wheels: wheels)
    }
}

Важно: Если подкласс не переопределяет все designated инициализаторы родителя, он их наследует. Однако модификатор required отменяет это правило наследования и явно обязывает к реализации.