Jaký je rozdíl mezi convention a designated inicializátory ve Swiftu?
sobes.tech AI
Odpověď od AI
-
Určený inicializátor: Hlavní, "základní" inicializátor ve třídě. Musí úplně inicializovat všechny vlastní uložené vlastnosti třídy a poté volat určený inicializátor nadtřídy (přes
super.init). Každá třída by měla mít alespoň jeden určený inicializátor. -
Convenience inicializátor: Pomocný inicializátor určený k zjednodušení vytváření instancí třídy v určitých scénářích. Musí volat jiný inicializátor ve stejné třídě — buď určený nebo convenience. Nakonec by řetězec volání convenience inicializátorů měl vést k volání určeného inicializátoru ve stejné třídě. Convenience inicializátory jsou volitelné.
Zde je schéma delegace inicializace:
Convenience -> Určený (ve stejné třídě)
Určený -> Určený (v rodičovské třídě)
Příklad:
class MyClass {
var value: Int
var name: String
// Určený inicializátor
init(value: Int, name: String) {
self.value = value
self.name = name
}
// Convenience inicializátor
convenience init(value: Int) {
self.init(value: value, name: "DefaultName") // Volá určený inicializátor ve stejné třídě
}
// Jiný convenience inicializátor
convenience init(name: String) {
self.init(value: 0, name: name) // Volá určený inicializátor ve stejné třídě
}
}
let instance1 = MyClass(value: 10, name: "Custom")
let instance2 = MyClass(value: 5)
let instance3 = MyClass(name: "Another")
Klíčový rozdíl spočívá v jejich roli v řetězci inicializace a pravidlech delegace: určený inicializátor zajišťuje úplnou inicializaci vlastních vlastností a deleguje inicializaci na rodičovskou třídu, zatímco convenience inicializátor zjednodušuje vytváření instancí delegováním na jiný inicializátor ve stejné třídě, který nakonec volá určený inicializátor.