Sobes.tech
Middle

Quelle est la différence entre les initialisateurs conventionnels et désignés en Swift?

sobes.tech IA

Réponse de l'IA

  • Initialiseur Désigné : L'initialiseur principal, "de base", dans la classe. Il doit entièrement initialiser toutes les propriétés stockées propres à la classe, puis appeler l'initialiseur désigné de la superclasse (via super.init). Chaque classe doit avoir au moins un initialiseur désigné.

  • Initialiseur de Commodité : Un initialiseur auxiliaire destiné à simplifier la création d'instances de la classe dans certains scénarios. Il doit appeler un autre initialiseur de la même classe — soit un désigné, soit un de commodité. En fin de compte, la chaîne d'appels des initialiseurs de commodité doit conduire à l'appel de l'initialiseur désigné dans la même classe. Les initialiseurs de commodité ne sont pas obligatoires.

Voici le schéma de délégation d'initialisation :

Convenience -> Designé (dans la même classe)
Designé -> Designé (dans la classe parente)

Exemple :

class MyClass {
    var value: Int
    var name: String

    // Initialiseur désigné
    init(value: Int, name: String) {
        self.value = value
        self.name = name
    }

    // Initialiseur de commodité
    convenience init(value: Int) {
        self.init(value: value, name: "DefaultName") // Appelle l'initialiseur désigné dans la même classe
    }

    // Autre initialiseur de commodité
    convenience init(name: String) {
        self.init(value: 0, name: name) // Appelle l'initialiseur désigné dans la même classe
    }
}

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

La différence clé réside dans leur rôle dans la chaîne d'initialisation et les règles de délégation : l'initialiseur désigné garantit la pleine initialisation de ses propriétés et délègue l'initialisation du parent, tandis que l'initialiseur de commodité simplifie la création d'instances en déléguant à un autre initialiseur dans la même classe, qui finit par appeler l'initialiseur désigné.