В каких случаях класс в Swift не получает стандартный инициализатор?

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

Ответ

Класс в Swift не получает автоматически сгенерированный memberwise инициализатор, в отличие от структур. Это происходит, если:

  1. Свойства класса не имеют значений по умолчанию.
  2. Суперкласс не предоставляет доступный инициализатор (в случае наследования).
  3. Класс определяет собственный designated инициализатор — это отключает наследование инициализаторов.

Пример:

class Person {
    var name: String // Нет значения по умолчанию
    var age: Int     // Нет значения по умолчанию
    // Без явного инициализатора компиляция не удастся
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

Решение:

  • Задать значения по умолчанию свойствам (var name: String = "").
  • Реализовать собственные designated инициализаторы.
  • Для структур memberwise инициализатор предоставляется автоматически.