Einschränkung abgeleitete Klassen von generischen Klassen in swift
Versuche ich leite meine Klasse von einer generischen Klasse:
class foo<T> {}
class bar : foo<Int> {}
Aber dieser code nicht kompilieren, mit de Fehler:
Abgeleitete Klassen von generischen Klassen müssen auch generische
Wie um diese Einschränkung zu vermeiden? Ist es möglich?
- Nein, es ist nicht möglich.
- So allgemein in swift ist fast unbrauchbar
- Nicht wahr, es einfach nicht das gleiche design haben wie die Generika in den anderen Sprachen.
- bitte Lesen Sie meine "poor man ' s solution" für das problem.
- Würde ich Zustimmen, das ist sehr lähmend.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ssreg,
Leider ist dies offizielle:
Lassen Sie uns hoffen, dass Apple behebt dies in einer zukünftigen version.
Zwischenzeit lassen Sie uns sehen dies als eine Gelegenheit zu nutzen, aggregation anstelle von Unterklassen.
HINWEIS:
Als ein armer Mann-version der Lösung, die man nutzen könnte
typealias
:Diese Weise wird der rest des Codes geschrieben werden können, als wenn Apple bereits behoben die Sache.
class bar<Int> : foo<Int> {}
den Int zu einem Platzhalter für den generischen Typ, überschreiben die tatsächliche swift Typ Int. Dies erzeugt sehr lustige Fehlermeldungen, wenn Sie versuchen, verwenden Sie die Int-Eigenschaften innerhalb der Klasse.. Es ist besser, verwenden Sie die hpique Lösung mit nicht verwendeten generischen Typ in der Kind-Klasse, und binden die Basis-Klasse zum echten Typ Int (oder die gewünschte)Bar<[MyClass]> : Foo<[MyClass]>
es sich über eine fehlende "identifier" name der generischen parameter"class bar<T:Int> : foo<Int> {}
Ich hatte das gleiche Problem und habe eine Lösung gefunden!
Können Sie jetzt tun:
Dieser wird standardmäßig Bar Typ SomeType. Der einzige Nachteil ist, dass Sie können dies nur tun, für 'subclassable' - Typen. Also für
Int
wird dies nicht funktionieren.public final class NonGenericSubclass {}
, dann aufbauend auf dem Beispiel oben, würde ich erklärenBar
etwa so:class Bar<T : NonGenericSubclass> : Foo<Int> { ... }
. Ich habe auf diese Weise bekommen alle die VorteileFoo
zusammengenommen int, aber ich kann immer noch initialisieren, als obBar
waren nicht generisch. Auch, weilNonGenericSubclass
deklariert istfinal
, es kann nicht sein, untergeordnet, so dass jede Klasse die Deklaration eines generischen Typs kann halten es nicht generisch für alle Absichten und Zwecke. Gut zu finden!In der Swift 2 ist es möglich, eine Unterklasse einer generischen Klasse:
class Fancy : Base<T>
. Deswegen @Tom van Zummeren Antwort korrekt aussiehtAlternative zu den
typealias
Lösung ist in der Dokumentation wörtlich:Also machen wir eine Unterklasse einer generischen Klasse, aber von einem anderen Typ, dass wir nicht für alles.
Ziehe ich diese Methode mit
typealias
weil Sie nicht verschmutzen die namespace mit einem zusätzlichen Typ. Dies ist insbesondere dann wichtig, wenn die Unterklasse (bar
) gemeint istpublic
oderinternal
.Bearbeiten
Die Dokumentation enthält nicht mehr den Satz über die Beschränkung der generischen Unterklassen. Hoffentlich bedeutet dies, dass Apple plant, dies zu ändern, eher früher als später.
typealias bar = bar<AnyObject>
nicht