如何约束扩展SequenceType的协议中的Generator.Element类型

时间:2016-05-28 17:50:57

标签: swift swift-extensions swift-protocols

假设我正在编写处理多个帐户的社交媒体抓取工具(例如Facebook,Twitter等)

我为消息定义了一些协议(Timestamped具有显示名称和消息正文,Forwarded具有时间戳,protocol MessageSource : SequenceType { associatedtype MessageType : Timestamped func messages (since : NSDate) -> Generator } 具有原始消息ID等。

然后我定义了一个消息来源的协议,我目前正在编写

n

我的想法是,我可以通过撰写msgSource.take(n)来获取d最新消息,并通过撰写msgSource.messages(since : d)

获取自Generator.Element日期以来的所有消息

我的问题是,如何将从SequenceType继承的MessageType约束为与Enumerable相同,因此两个生成器都保证返回相同的类型。

1 个答案:

答案 0 :(得分:1)

默认情况下,您可以实现类似的功能:

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

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

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