Sobes.tech
Middle

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.