Sobes.tech
Middle

Каква е разликата между convention и designated инициализаторите в Swift?

sobes.tech AI

Отговор от AI

  • Определен инициализатор: Главният, „основен“ инициализатор в класа. Той трябва напълно да инициализира всички собствени съхранявани свойства на класа и след това да извика определен инициализатор на родителския клас (чрез super.init). Всеки клас трябва да има поне един определен инициализатор.

  • Удобен инициализатор: Вспомагателен инициализатор, предназначен да улесни създаването на екземпляри на класа в определени сценарии. Трябва да извика друг инициализатор от същия клас — или определен, или удобен. В крайна сметка, веригата от извиквания на удобни инициализатори трябва да доведе до извикване на определен инициализатор в същия клас. Удобните инициализатори са по избор.

Ето схемата за делегиране на инициализация:

Convenience -> Определен (в същия клас)
Определен -> Определен (в родителския клас)

Пример:

class MyClass {
    var value: Int
    var name: String

    // Определен инициализатор
    init(value: Int, name: String) {
        self.value = value
        self.name = name
    }

    // Удобен инициализатор
    convenience init(value: Int) {
        self.init(value: value, name: "DefaultName") // Извиква определен инициализатор в същия клас
    }

    // Друг удобен инициализатор
    convenience init(name: String) {
        self.init(value: 0, name: name) // Извиква определен инициализатор в същия клас
    }
}

let instance1 = MyClass(value: 10, name: "Custom")
let instance2 = MyClass(value: 5)
let instance3 = MyClass(name: "Another")

Ключовата разлика е в ролята им в веригата за инициализация и правилата за делегиране: определен инициализатор гарантира пълната инициализация на своите свойства и делегира инициализация към родителския клас, докато удобният инициализатор улеснява създаването на екземпляри, делегирайки към друг инициализатор в същия клас, който в крайна сметка извиква определен инициализатор.