Sobes.tech
Middle

Mi a különbség a convention és a designated inicializátorok között Swiftben?

sobes.tech MI

Válasz az MI-től

  • Megállapított Inicializáló: A fő, „alap” inicializáló az osztályban. Teljes mértékben inicializálnia kell az osztály saját tárolt tulajdonságait, majd meghívnia a szülőosztály megállapított inicializálóját (super.init) a hierarchiában. Minden osztálynak legalább egy megállapított inicializálóval kell rendelkeznie.

  • Kényelmi Inicializáló: Egy segéd inicializáló, amely megkönnyíti az osztály példányainak létrehozását bizonyos forgatókönyvekben. Kötelező másik inicializálót hívnia ugyanabból az osztályból — akár megállapított, akár kényelmi. Végső soron a kényelmi inicializálók láncolata a megállapított inicializáló hívásához kell, hogy vezessen ugyanabban az osztályban. A kényelmi inicializálók opcionálisak.

Íme az inicializálás delegálási sémája:

Convenience -> Megállapított (ugyanabban az osztályban)
Megállapított -> Megállapított (a szülőosztályban)

Példa:

class MyClass {
    var value: Int
    var name: String

    // Megállapított inicializáló
    init(value: Int, name: String) {
        self.value = value
        self.name = name
    }

    // Kényelmi inicializáló
    convenience init(value: Int) {
        self.init(value: value, name: "DefaultName") // Meghívja a megállapított inicializálót ugyanabban az osztályban
    }

    // Más kényelmi inicializáló
    convenience init(name: String) {
        self.init(value: 0, name: name) // Meghívja a megállapított inicializálót ugyanabban az osztályban
    }
}

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

A fő különbség az, hogy szerepük az inicializálási láncban és a delegálási szabályokban rejlik: a megállapított inicializáló garantálja a saját tulajdonságainak teljes inicializálását és delegálja az inicializálást a szülőosztálynak, míg a kényelmi inicializáló egyszerűsíti az példányok létrehozását más inicializálóra delegálva ugyanabban az osztályban, amely végül meghívja a megállapított inicializálót.