Sobes.tech
Middle

Jaka jest różnica między inicjalizatorami convention a designated w Swift?

sobes.tech AI

Odpowiedź od AI

  • Inicjalizator wyznaczony: Główny, "podstawowy" inicjalizator w klasie. Musi w pełni zainicjalizować wszystkie własne właściwości przechowywane klasy, a następnie wywołać wyżej w hierarchii wyznaczony inicjalizator klasy nadrzędnej (przez super.init). Każda klasa powinna mieć co najmniej jeden wyznaczony inicjalizator.

  • Inicjalizator wygodny: Pomocniczy inicjalizator mający na celu uproszczenie tworzenia instancji klasy w określonych scenariuszach. Musi wywołać inny inicjalizator tej samej klasy — albo wyznaczony, albo wygodny. Ostatecznie, łańcuch wywołań inicjalizatorów wygodnych powinien doprowadzić do wywołania wyznaczonego inicjalizatora w tej samej klasie. Inicjalizatory wygodne są opcjonalne.

Oto schemat delegowania inicjalizacji:

Convenience -> Designated (w tej samej klasie)
Designated -> Designated (w klasie nadrzędnej)

Przykład:

class MyClass {
    var value: Int
    var name: String

    // Wyznaczony inicjalizator
    init(value: Int, name: String) {
        self.value = value
        self.name = name
    }

    // Inicjalizator wygodny
    convenience init(value: Int) {
        self.init(value: value, name: "DefaultName") // Wywołuje wyznaczony inicjalizator w tej samej klasie
    }

    // Inny inicjalizator wygodny
    convenience init(name: String) {
        self.init(value: 0, name: name) // Wywołuje wyznaczony inicjalizator w tej samej klasie
    }
}

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

Kluczowa różnica polega na ich roli w łańcuchu inicjalizacji i zasadach delegacji: wyznaczony inicjalizator gwarantuje pełną inicjalizację własnych właściwości i deleguje inicjalizację do klasy nadrzędnej, podczas gdy inicjalizator wygodny upraszcza tworzenie instancji, delegując do innego inicjalizatora w tej samej klasie, który ostatecznie wywołuje wyznaczony inicjalizator.