如何在扩展 SequenceType 的协议中限制 Generator.Element 的类型

How to constrain the type of Generator.Element in a Protocol extending SequenceType

假设我正在编写处理多个帐户(例如 Facebook、Twitter 等)的社交媒体爬虫

我为消息定义了一些协议(Message 有显示名称和消息正文,Timestamped 有时间戳,Forwarded 有原始消息 ID 等)。

然后我为消息源定义一个协议,我目前已经编写了该协议

protocol MessageSource : SequenceType {
    associatedtype MessageType : Timestamped

    func messages (since : NSDate) -> Generator
}

我的想法是,我可以通过写入 msgSource.take(n) 来获取 n 最近的消息,并通过写入 msgSource.messages(since : d)[=22= 来获取自日期 d 以来的所有消息]

我的问题是,我如何限制从 SequenceType 继承的 Generator.ElementMessageType 相同,从而保证两个生成器的 return 类型相同.

您可以通过默认实现协议来实现类似的功能:

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

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

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