Gemäß der Dokumentation von Apple benötigt Swift nicht unbedingt das Initialisieren des Initialisierers. In einem folgenden Codebeispiel erbt Bar
initializer von Foo
:Warum benötigt Swift das Überschreiben des designierten Initialisierers der generischen Superklasse?
class Foo {
let value: Int
init(value: Int = 5) {
self.value = value
}
}
class Bar: Foo {
}
Sobald wir einige generische in Foo
wie class Foo<T> {
Xcode bietet uns einen Fehler Initializer does not override a designated initializer from its superclass
hinzufügen. Gibt es eine Dokumentation oder eine schnelle Evolutionsdiskussion, die erklärt, warum es passiert?
Aktualisierung. Es scheint, dass Generic keine Hauptursache für Override-Anforderungen ist. Hier ist eine Option, wie eine Klasse mit generisch zu definieren, die nicht außer Kraft gesetzt bestimmter Initialisierung erfordert:
protocol FooProtocol {
associatedtype T
}
class Foo<U>: FooProtocol {
typealias T = U
let value: Int
init(value: Int, otherValue: T) {
self.value = value
self.otherValue = otherValue
}
}
class Bar: Foo<Int> {
}
Allerdings gibt es eine weitere interessante Beobachtung des Verhaltens. Definieren initializer wie folgende Ursache Überschreibung Anforderung:
init(value: Int = 5) {
self.value = value
}
Die Komische Sache, die wie folgt in einer solche bezeichnet initializer Ursache diese Überschreibung Anforderung eines weiteren Parameter hinzufügen zu verschwinden:
init(value: Int = 5, otherValue: T) {
self.value = value
}
Update 2. Ich kann keine logische Erklärung für dieses Verhalten an dieser Stelle finden berichten ich es als Compiler Bug - https://bugs.swift.org/browse/SR-1375
Ich habe mehr Tests durchgeführt und das Problem scheint _der Standardwert_ zu sein. Nehmen Sie die '= 5' aus Ihren Beispielen und _none_ von ihnen führen zu dem Compiler-Fehler. – matt