Sobes.tech
Middle

Kuo skiriasi convention ir designated inicializatoriai Swift?

sobes.tech AI

Atsakymas iš AI

  • Nurodytasis Inicijatorius: Pagrindinis, "pagrindinis" inicijatorius klasėje. Jis turi visiškai inicializuoti visas savo klasės saugomus savybes, o tada iškviesti aukštesnįjį nurodytą ir inicijatorių (per super.init). Kiekvienas klasė turi turėti bent vieną nurodytą inicijatorių.

  • Patogus Inicijatorius: Pagalbinis inicijatorius, skirtas supaprastinti klasės pavyzdžių kūrimą tam tikrose situacijose. Jis būtinai turi iškviesti kitą inicijatorių iš to paties klasės – arba nurodytą, arba kitą patogų. Galiausiai, patogių inicijatorių grandinė turi vesti į nurodytą inicijatorių toje pačioje klasėje. Patogūs inicijatoriai nėra privalomi.

Štai inicijavimo delegavimo schema:

Patogus -> Nurodytas (toje pačioje klasėje)
Nurodytas -> Nurodytas (tėvų klasėje)

Pavyzdys:

class MyClass {
    var value: Int
    var name: String

    // Nurodytas inicijatorius
    init(value: Int, name: String) {
        self.value = value
        self.name = name
    }

    // Patogus inicijatorius
    convenience init(value: Int) {
        self.init(value: value, name: "DefaultName") // Iškviečia tą patį klasės nurodytą inicijatorių
    }

    // Patogus inicijatorius
    convenience init(name: String) {
        self.init(value: 0, name: name) // Iškviečia tą patį klasės nurodytą inicijatorių
    }
}

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

Pagrindinis skirtumas tarp jų yra jų vaidmuo inicializacijos grandinėje ir delegavimo taisyklės: nurodytas inicijatorius užtikrina pilną savo savybių inicializaciją ir deleguoja tėvų klasės inicializaciją, o patogūs inicijatoriai supaprastina pavyzdžių kūrimą, deleguodami kitam inicijatoriui toje pačioje klasėje, galų gale veda į nurodytą inicijatorių.