Sobes.tech
Middle

Qual è la differenza tra gli inizializzatori convention e designated in Swift?

sobes.tech AI

Risposta dell'AI

  • Inizializzatore Designato: L'inizializzatore principale, "di base", nella classe. Deve inizializzare completamente tutte le proprietà memorizzate proprie della classe, e poi chiamare l'inizializzatore designato della superclasse (tramite super.init). Ogni classe deve avere almeno un inizializzatore designato.

  • Inizializzatore di Convenienza: Un inizializzatore ausiliario destinato a semplificare la creazione di istanze della classe in determinati scenari. Deve chiamare un altro inizializzatore della stessa classe — sia un designato che uno di convenienza. In definitiva, la catena di chiamate degli inizializzatori di convenienza deve portare alla chiamata dell'inizializzatore designato nella stessa classe. Gli inizializzatori di convenienza sono opzionali.

Ecco lo schema di delega dell'inizializzazione:

Convenience -> Designato (nella stessa classe)
Designato -> Designato (nella classe genitore)

Esempio:

class MyClass {
    var value: Int
    var name: String

    // Inizializzatore designato
    init(value: Int, name: String) {
        self.value = value
        self.name = name
    }

    // Inizializzatore di convenienza
    convenience init(value: Int) {
        self.init(value: value, name: "DefaultName") // Chiama l'inizializzatore designato nella stessa classe
    }

    // Altro inizializzatore di convenienza
    convenience init(name: String) {
        self.init(value: 0, name: name) // Chiama l'inizializzatore designato nella stessa classe
    }
}

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

La differenza chiave risiede nel loro ruolo nella catena di inizializzazione e nelle regole di delega: l'inizializzatore designato garantisce la completa inizializzazione delle proprie proprietà e delega l'inizializzazione del genitore, mentre l'inizializzatore di convenienza semplifica la creazione di istanze delegando a un altro inizializzatore nella stessa classe, che alla fine chiama l'inizializzatore designato.