Исчезает ли memberwise инициализатор у структуры при добавлении кастомного инициализатора?

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

Ответ

Поведение дефолтных инициализаторов структуры зависит от инициализации её свойств (хранимых переменных).

Основные правила:

  1. Структура БЕЗ кастомных инициализаторов автоматически получает два инициализатора:

    • Memberwise инициализатор: init(property1: Type1, property2: Type2, ...).
    • Дефолтный инициализатор: init(), но только если все свойства имеют значения по умолчанию.
  2. Добавление кастомного инициализатора НЕ приводит к автоматической потере memberwise инициализатора, если все свойства структуры уже имеют значения по умолчанию. В этом случае оба инициализатора (memberwise и кастомный) доступны.

Пример 1: Memberwise инициализатор сохраняется

struct Person {
    var name: String
    var age: Int = 0 // Свойство имеет значение по умолчанию

    // Кастомный инициализатор
    init(name: String) {
        self.name = name // age примет дефолтное значение 0
    }
}

// Оба инициализатора работают:
let p1 = Person(name: "Alice") // Кастомный init(name:)
let p2 = Person(name: "Bob", age: 25) // Memberwise инициализатор

Пример 2: Memberwise инициализатор теряется

struct Point {
    var x: Double
    var y: Double

    init(x: Double, y: Double) { // Явно реализуем memberwise инициализатор
        self.x = x
        self.y = y
    }

    init() { // Добавляем ещё один кастомный
        self.init(x: 0, y: 0)
    }
}
// Теперь доступны ТОЛЬКО два объявленных выше инициализатора.
// Автоматический memberwise init(x:y:) больше не генерируется.

Вывод: Чтобы сохранить автоматический memberwise инициализатор, убедитесь, что все свойства без дефолтных значений инициализируются в вашем кастомном init, либо предоставьте им значения по умолчанию.