Sobes.tech
Middle

Kāda ir atšķirība starp convention un designated inicializatoriem Swift?

sobes.tech AI

Atbilde no AI

  • Norādītais inicijators: Galvenais, "pamatinis" inicijators klasē. Tam jāpilnībā inicializē visas savas klases glabātās īpašības, pēc tam jāizsauc augstākā līmeņa norādītais un inicijators (caur super.init). Katram klasē jābūt vismaz vienam norādītajam inicijatoram.

  • Ērtā inicijatora: Palīdzības inicijators, kas paredzēts, lai vienkāršotu klases piemēru izveidi noteiktos scenārijos. Tam obligāti jāizsauc cits tajā pašā klasē esošais inicijators – vai nu norādītais, vai cits ērtākais. Galu galā, ērtāko inicijatoru ķēde jāved uz norādīto inicijatoru tajā pašā klasē. Ērtie inicijatori nav obligāti.

Šeit ir inicializācijas deleģēšanas shēma:

Ērtā -> Norādītā (tajā pašā klasē)
Norādītā -> Norādītā (vecāklasē)

Piemērs:

class MyClass {
    var value: Int
    var name: String

    // Norādītais inicijators
    init(value: Int, name: String) {
        self.value = value
        self.name = name
    }

    // Ērtā inicijators
    convenience init(value: Int) {
        self.init(value: value, name: "DefaultName") // Izsauc to pašu klases norādīto inicijatoru
    }

    // Ērtā inicijators
    convenience init(name: String) {
        self.init(value: 0, name: name) // Izsauc to pašu klases norādīto inicijatoru
    }
}

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

Galvenā atšķirība ir to lomā inicializācijas ķēdē un deleģēšanas noteikumos: norādītais inicijators nodrošina pilnīgu savu īpašību inicializāciju un deleģē vecāklases inicijatoru, kamēr ērtie inicijatori vienkāršo piemēru izveidi, deleģējot citam inicijatoram tajā pašā klasē, galā nonākot pie norādītā inicijatora.