Вопрос проверяет понимание правил генерации инициализаторов компилятором Swift.
Дефолтный init в структуре генерируется только если Swift может гарантировать безопасную инициализацию. Когда разработчик объявляет собственный инициализатор, компилятор считает, что ответственность за инициализацию полностью передана ему. Поэтому автоматический init удаляется. Это сделано для предотвращения частично инициализированных объектов. Такое поведение является осознанным дизайнерским решением Swift.
Swift строго контролирует инициализацию структур, чтобы исключить некорректные состояния объектов.
Дефолтный инициализатор — это автоматически сгенерированный init, который Swift добавляет, если это безопасно.
Перед перечислением важно понимать, что компилятор не может угадать намерения разработчика.
Пользовательский init может инициализировать свойства иначе
Компилятор больше не уверен, что стандартный init корректен
Ответственность полностью перекладывается на разработчика
struct Point {
let x: Int
let y: Int
init(x: Int) {
self.x = x
self.y = 0
}
}
В этом случае init(x:y:) больше не генерируется автоматически.
Можно вынести инициализатор в extension.
struct Point {
let x: Int
let y: Int
}
extension Point {
init(x: Int) {
self.x = x
self.y = 0
}
}
Swift убирает дефолтный init, чтобы избежать ошибок и двусмысленностей. Если нужен и автоматический, и кастомный инициализатор, стоит использовать extension.