Care este diferența dintre initializatoarele convention și designated în Swift?
sobes.tech AI
Răspuns de la AI
-
Inițializator desemnat: Inițializatorul principal, "de bază", în clasă. Trebuie să inițializeze complet toate proprietățile stocate proprii ale clasei, apoi să apeleze inițializatorul desemnat al clasei părinte (prin
super.init). Fiecare clasă trebuie să aibă cel puțin un inițializator desemnat. -
Inițializator de conveniență: Un inițializator auxiliar destinat să simplifice crearea instanțelor clasei în anumite scenarii. Trebuie să apeleze alt inițializator din aceeași clasă — fie desemnat, fie de conveniență. În cele din urmă, lanțul de apeluri ale inițializatoarelor de conveniență trebuie să conducă la apelarea inițializatorului desemnat în aceeași clasă. Inițializatoarele de conveniență sunt opționale.
Iată schema de delegare a inițializării:
Convenience -> Desemnat (în aceeași clasă)
Desemnat -> Desemnat (în clasa părinte)
Exemplu:
class MyClass {
var value: Int
var name: String
// Inițializator desemnat
init(value: Int, name: String) {
self.value = value
self.name = name
}
// Inițializator de conveniență
convenience init(value: Int) {
self.init(value: value, name: "DefaultName") // Apelează inițializatorul desemnat în aceeași clasă
}
// Alt inițializator de conveniență
convenience init(name: String) {
self.init(value: 0, name: name) // Apelează inițializatorul desemnat în aceeași clasă
}
}
let instance1 = MyClass(value: 10, name: "Custom")
let instance2 = MyClass(value: 5)
let instance3 = MyClass(name: "Another")
Diferența cheie constă în rolul lor în lanțul de inițializare și regulile de delegare: inițializatorul desemnat garantează inițializarea completă a propriilor proprietăți și delegă inițializarea către clasa părinte, în timp ce inițializatorul de conveniență simplifică crearea de instanțe delegând către alt inițializator în aceeași clasă, care în cele din urmă apelează inițializatorul desemnat.