Ответ
Поведение дефолтных инициализаторов структуры зависит от инициализации её свойств (хранимых переменных).
Основные правила:
-
Структура БЕЗ кастомных инициализаторов автоматически получает два инициализатора:
- Memberwise инициализатор:
init(property1: Type1, property2: Type2, ...). - Дефолтный инициализатор:
init(), но только если все свойства имеют значения по умолчанию.
- Memberwise инициализатор:
-
Добавление кастомного инициализатора НЕ приводит к автоматической потере 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, либо предоставьте им значения по умолчанию.