2015-11-23 8 views
6

Beachten Sie Folgendes:Swift - assoziierte Typen im Protokoll mit Where-Klausel?

protocol SomeProtocol { 
    typealias F: Foo 
    typealias FB: FooBar where FB.Foo == F 
} 

Aber dies nicht kompiliert, da wir nicht where Klausel in typealias so sagen kann.

ich hier etwas fehlt muss, da diese leicht mit type parameterization wie dies getan werden kann:

struct SomeStruct<F: Foo, FB: FooBar where FB.Foo == F> {} 

Was ist die where Klausel Äquivalent für associated type?

+1

Ein ähnliches Problem Teil dieser Frage ist: http://stackoverflow.com/questions/33843038/define-a-swift-protocol-which-requires -a-spezifischer Typ der Sequenz. –

+2

Sie verpassen nichts. Dies ist derzeit in Swift nicht möglich. –

+0

Dies wurde über Radar angefordert: http://openradar.appspot.com/17203060, http://www.openradar.me/21441502, und auf swift-evolution erwähnt: https://lists.swift.org/pipermail /swift-evolution/Week-of-Mon-20160229/011666.html (siehe Überschrift "* Beliebige Anforderungen in Protokollen"), aber ich glaube nicht, dass jemand einen Evolutionsvorschlag erstellt hat. –

Antwort

0

Die Typparametrisierung zugehöriger Typen in Protokollen wird derzeit in Swift (2.1) nicht unterstützt.

Obwohl Sie in diesem Fall nicht einmal die Where-Klausel für die Funktionalität benötigen. Es ist mehr die Bequemlichkeit, die Sie bekommen, wo Sie dies tun können:

func someFunc<T: SomeProtocol>(someProt: T, foo: T.F) { 
    ... 
} 

// Instead of this: 

func someFunc<T: SomeProtocol>(someProt: T, foo: T.FB.Foo) { 
    ... 
} 
+0

Nun, ja, Sie haben Recht. Aber das war ein konstruiertes Beispiel für Einfachheit. Danke für die Antwort! –

+0

@DanielShin Während while-Klauseln in Protokollen nett wären, wäre in fast jedem Fall ein generisches Protokoll wie 'SequenceType ' die Lösung .... Hoffe auf Swift 3 – Qbyte

+0

@Qbyte ja. Ein generisches Protokoll, falls verfügbar, bedeutet genau dasselbe wie "generische" Typalias aus der Frage. Es ist nur eine andere Syntax für das gleiche Verhalten. Es gibt viele Argumente für generische Protokolle und viele davon dagegen. In der realen Welt können wir sehr einfach ohne generische Protokolle überleben. Unser SW aus anderen Sprachen zu übersetzen, ist das Schlimmste, was wir tun können. Ich bevorzuge, dass Swift sich für eine Weile stabilisiert, ich suche nach besserer xcode-Unterstützung, Refactoring, Open-Source-Version der Standard-Bibliothek, zuerst. und als nächstes würden generische Protokolle als "Extra-Bonus" verfügbar sein – user3441734