Назад к вопросам
Middle
97
questionbank

В чем отличие между 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 инициализатора.