Ich versuche, einen Initializer für das Protokoll A
auf einem Typ erforderlich, der sowohl A
entspricht als auch eine Unterklasse von C
ist.Generische Constraints und Initialisierung Vererbung in Swift
Alles ist gut und gut, wenn C
eine Basisklasse ist. Aber sobald C
Unterklassen eine andere Klasse, sagen wir B
, bricht es.
Hier ist, was ich rede:
protocol A {
init(foo: String)
}
class B {
init() {}
}
class C: B {}
func makeSomething<T: A>() -> T where T: B {
return T(foo: "Hi")
}
, das funktioniert. Aber wenn ich where T: B
zu where T: C
ändere, erhalte ich den folgenden Fehler: argument passed to call that takes no arguments
. Es wird mir nur erlauben, B
s init
anzurufen.
Warum kann ich diesen Initialisierer nicht aufrufen? Ich verstehe, dass die Superklasse ihre eigenen Initiatoren hat, die aufgerufen werden müssen. Aber das wird erzwungen, wenn jemand tatsächlich die Klasse der Unterklasse B
schreibt und A
entspricht. (Z. B. Implementierung und Aufruf super.init(bar: Int)
innen).
Jede Hilfe hier würde sehr geschätzt werden. Vielen Dank!