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é.