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.