Ответ
Swift не генерирует автоматический memberwise инициализатор для классов из-за их наследуемой природы и требований безопасности инициализации.
Основные причины:
- Наследование — класс должен гарантировать корректную инициализацию не только своих свойств, но и унаследованных от суперкласса.
- Безопасность — компилятор требует явного контроля над процессом инициализации для предотвращения частично инициализированных объектов.
- Гибкость — классы могут иметь вычисляемые свойства, наблюдатели или требовать дополнительной логики при инициализации.
Три способа обеспечить инициализацию класса:
- Назначение значений по умолчанию всем stored-свойствам
- Реализация собственного инициализатора
- Наследование инициализатора от суперкласса
Пример:
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 инициализатор, так как они не поддерживают наследование и имеют более простую семантику копирования.