Почему Swift не генерирует memberwise инициализатор для классов?

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

Ответ

Swift не генерирует автоматический memberwise инициализатор для классов из-за их наследуемой природы и требований безопасности инициализации.

Основные причины:

  1. Наследование — класс должен гарантировать корректную инициализацию не только своих свойств, но и унаследованных от суперкласса.
  2. Безопасность — компилятор требует явного контроля над процессом инициализации для предотвращения частично инициализированных объектов.
  3. Гибкость — классы могут иметь вычисляемые свойства, наблюдатели или требовать дополнительной логики при инициализации.

Три способа обеспечить инициализацию класса:

  1. Назначение значений по умолчанию всем stored-свойствам
  2. Реализация собственного инициализатора
  3. Наследование инициализатора от суперкласса

Пример:

class Person {
    var name: String
    var age: Int

    // Должны написать явно — Swift не сгенерирует init(name:age:)
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

// Для сравнения — структура получает memberwise инициализатор автоматически
struct Point {
    var x: Double
    var y: Double
    // Имеет init(x:y:) по умолчанию
}

Контраст со структурами: Структуры получают memberwise инициализатор, так как они не поддерживают наследование и имеют более простую семантику копирования.