Was ist der Unterschied zwischen Convention- und Designated-Initialisierern in Swift?
sobes.tech KI
Antwort von AI
-
Zugesagter Initializer: Der Haupt-, "grundlegende" Initializer in der Klasse. Er muss alle eigenen gespeicherten Eigenschaften vollständig initialisieren und dann den designated Initializer der Superklasse (über
super.init) aufrufen. Jede Klasse muss mindestens einen designated Initializer haben. -
Convenience Initializer: Ein Hilfsinitialisierer, der dazu dient, die Erstellung von Klasseninstanzen in bestimmten Szenarien zu vereinfachen. Er muss einen anderen Initializer derselben Klasse aufrufen – entweder einen designated oder einen anderen convenience. Letztendlich muss die Kette der Convenience-Initialisierer zum Aufruf des designated Initializers in derselben Klasse führen. Convenience-Initialisierer sind optional.
Hier ist das Delegierungsschema für Initialisierung:
Convenience -> Designated (in derselben Klasse)
Designated -> Designated (in der Elternklasse)
Beispiel:
class MyClass {
var value: Int
var name: String
// Designated Initializer
init(value: Int, name: String) {
self.value = value
self.name = name
}
// Convenience Initializer
convenience init(value: Int) {
self.init(value: value, name: "DefaultName") // Ruft den designated Initializer in derselben Klasse auf
}
// Weiterer Convenience Initializer
convenience init(name: String) {
self.init(value: 0, name: name) // Ruft den designated Initializer in derselben Klasse auf
}
}
let instance1 = MyClass(value: 10, name: "Custom")
let instance2 = MyClass(value: 5)
let instance3 = MyClass(name: "Another")
Der entscheidende Unterschied liegt in ihrer Rolle in der Initialisierungskette und den Delegierungsregeln: Der designated Initializer stellt die vollständige Initialisierung seiner Eigenschaften sicher und delegiert die Initialisierung an die Elternklasse, während der convenience Initializer die Instanziierung vereinfacht, indem er an einen anderen Initializer in derselben Klasse delegiert, der letztlich den designated Initializer aufruft.