2016-05-28 2 views
4

Предположит, я пишу социальный медиа искателю, что дескриптор несколько учетных записей (например, Facebook, Twitter и т.д.)Как ограничить тип Generator.Element в Протоколе расширение SequenceType

Я определяю несколько протоколов для сообщений (Message имеет отображаемое имя и тело сообщения, Timestamped имеет временную метку, Forwarded имеет исходный идентификатор сообщения и т. Д.).

я затем определить протокол для источника сообщений, которые я в настоящее время письменного

protocol MessageSource : SequenceType { 
    associatedtype MessageType : Timestamped 

    func messages (since : NSDate) -> Generator 
} 

Идея заключается в том, я могу получить n самые последние сообщения в письменной форме msgSource.take(n) и получить все сообщения с момента даты d написав msgSource.messages(since : d)

Мой вопрос, как я могу ограничить Generator.Element унаследованный от SequenceType быть идентичны MessageType, поэтому оба генератора гарантированно возвращает тот же тип.

ответ

1

Вы можете добиться аналогичной функциональности по реализации по умолчанию протоколов:

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

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

    func foo() -> MessageType? { 
     ... 
    } 
} 
Смежные вопросы