2016-05-28 3 views
4

erstreckt Angenommen, ich bin ein Social-Media-Crawler zu schreiben, die mehrere Konten verarbeiten (zB Facebook, Twitter, etc.)Wie die Art des Generator.Element in einem Protokoll beschränken SequenceType

ich einige Protokolle für Nachrichten definieren (Message hat Anzeigename und Nachrichtentext, Timestamped hat einen Zeitstempel, Forwarded hat die ursprüngliche Nachrichten-ID usw.).

ich ein Protokoll für eine Quelle von Nachrichten, dann definieren, die ich zur Zeit

protocol MessageSource : SequenceType { 
    associatedtype MessageType : Timestamped 

    func messages (since : NSDate) -> Generator 
} 

Die Idee geschrieben habe, ist ich die n neuesten Nachrichten seit einem Datum msgSource.take(n) durch das Schreiben und erhalte alle Nachrichten bekommen kann d von msgSource.messages(since : d)

Meine Frage ist das Schreiben, wie einschränken ich die Generator.Element von SequenceType geerbt sein identisch mit MessageType, so dass beide Generatoren sind garantiert die gleiche Art zurückzukehren.

Antwort

1

können Sie eine ähnliche Funktionalität von Standardimplementierung von Protokollen erreichen:

protocol MessageSource: SequenceType { 
    func messages (since : NSDate) -> Generator 
} 

extension MessageSource where Generator.Element: Timestamped { 
    typealias MessageType = Generator.Element 

    func foo() -> MessageType? { 
     ... 
    } 
} 
Verwandte Themen