В чем отличие между convention и designated инициализаторами в Swift?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
-
Designated Инициализатор: Главный, "основной" инициализатор в классе. Он должен полностью инициализировать все собственные хранимые свойства класса, а затем вызывать вверх по иерархии designated инициализатор родительского класса (через
super.init). Каждый класс должен иметь хотя бы один designated инициализатор. -
Convenience Инициализатор: Вспомогательный инициализатор, призванный упростить создание экземпляров класса в определенных сценариях. Он обязательно должен вызывать другой инициализатор из того же класса – либо designated, либо другой convenience. ultimately, цепочка вызовов convenience инициализаторов должна привести к вызову designated инициализатора в том же классе. Convenience инициализаторы необязательны.
Вот схема делегирования инициализации:
Convenience -> Designated (в том же классе)
Designated -> Designated (в родительском классе)
Пример:
class MyClass {
var value: Int
var name: String
// Designated инициализатор
init(value: Int, name: String) {
self.value = value
self.name = name
}
// Convenience инициализатор
convenience init(value: Int) {
self.init(value: value, name: "DefaultName") // Вызывает designated инициализатор в этом же классе
}
// Convenience инициализатор
convenience init(name: String) {
self.init(value: 0, name: name) // Вызывает designated инициализатор в этом же классе
}
}
let instance1 = MyClass(value: 10, name: "Custom")
let instance2 = MyClass(value: 5)
let instance3 = MyClass(name: "Another")
Ключевое отличие заключается в их роли в цепочке инициализации и правилах делегирования: designated гарантирует полную инициализацию своих свойств и делегирует инициализацию родителя, тогда как convenience упрощает создание экземпляров, делегируя другому инициализатору в том же классе, в конечном итоге приводя к вызову designated инициализатора.