Ist etwas wie
%Vor%oder
%Vor%in Swift 2.1 möglich?
Update für Swift 4
Swift 4 unterstützt jetzt diese Funktion! lesen Sie mehr hier
Nicht als verschachteltes Protokoll, aber es ist ziemlich einfach, die Art Radiergummis (die "Any" Strukturen) zu verwenden.
%Vor% Dies ist eigentlich oft sehr praktisch für Rückgabewerte, da der Aufrufer sich normalerweise nicht so sehr um den eigentlichen Typ kümmert. Sie müssen nur ein return AnyRandomAccessCollection(resultArray)
am Ende Ihrer Funktion werfen und alles funktioniert. Viele stdlib geben nun Any
radiergummis zurück. Für das Rückgabewertproblem ist es fast immer so, wie ich es empfehle. Es hat den netten Nebeneffekt, A
concrete zu machen, so dass es viel einfacher ist, damit zu arbeiten.
Wenn Sie die CollectionType
beibehalten möchten, müssen Sie sie an dem Punkt einschränken, an dem Sie eine Funktion erstellen, die sie benötigt. Zum Beispiel:
Dies ist nicht ideal, da Sie A
mit der falschen Art von Sammlungsart haben können. Sie werden einfach keine sum
-Methode haben. Sie werden auch wiederholen, dass "Where IntCollection.Generator.Element == Int" in einer überraschenden Anzahl von Orten.
Meiner Erfahrung nach ist es diese Anstrengung selten wert, und Sie kehren schnell zu Arrays zurück (die sowieso der dominierende CollectionType sind). Aber wenn Sie es brauchen, sind dies die beiden wichtigsten Ansätze. Das ist das Beste, was wir heute haben.
Sie können dies nicht aufrecht wie in Ihrer Frage tun, und es gibt mehrere Themen hier auf SO zum Thema der Verwendung von Protokollen als Typdefinitionen, mit Inhalt, der selbst oder assoziierte Typ Anforderungen enthält (Ergebnis: das ist nicht erlaubt ). Siehe z.B. der Link von Christik , oder Thread Fehler beim Verwenden der zugeordneten Typen und Generika .
Für das obige Beispiel könnten Sie die folgende Problemumgehung verwenden, indem Sie vielleicht das gesuchte Verhalten nachahmen:
%Vor% Sie können also Blueprints für Ihre generischen Collection-Typen in Ihrem Protokoll A
implementieren und diese Blueprints im "Interface-Typ" B
implementieren, die auch die eigentliche Collection als Mitglied enthalten Eigentum. Ich habe die Methode largestValue()
über von hier genommen.
Beispielverwendung:
%Vor%