2016-01-23 3 views
1

Есть ли способ сообщить компилятору, что общий тип будет соответствовать определенному протоколу во время выполнения?Swift: введите общий тип в протокол

Компилятор не может этого знать, но я знаю, и из-за этого я могу запретить пользователям моей библиотеки указывать соответствующий тип.

public extension Observable { 
    public func cache(provider : Provider) -> Observable<E> { 
     return cacheInternal(provider) // error: Type 'Element' does not conform to protocol 'Mappable' 
    } 

    internal func cacheInternal<T : Mappable>(provider : Provider) -> Observable<T> { 
     //implementation 
    } 

    //what I want to avoid 
    public func cache<T : Mappable>(type: T.Type, provider : Provider) -> Observable<E> { 
     //implementation 
    } 
} 

И я не могу изменить общий тип «элемент (E)» в соответствии с отображаемым протоколом, поскольку Наблюдаемый класс, который я только расширяюсь.

Спасибо!

ответ

0

Условное соответствие протокола может быть решением для вас.

Поскольку ваша cacheInternal(provider:) функции нуждается в соответствии с протоколом Mappable, эта функция должен быть расширена только для типа Observable с универсальным типом E, который соответствует Mappable. Это может быть достигнуто с помощью where -clause в объявлении расширения:

public extension Observable where E: Mappable { 
    public func cache(provider : Provider) -> Observable<E> { 
     return cacheInternal(provider) 
    } 

    internal func cacheInternal<T: Mappable>(_ provider : Provider) -> Observable<T> { 
     //implementation 
     return Observable<T>() //added this to silence the error that nothing is returned. Don't know, what exactly you want to return 
    } 
} 

Сноска: Я обновил код Swift 3, чтобы проверить его правильно. (не могу проверить на 2.x на данный момент) Я думаю, что это было просто _ в cacheInternal, чтобы скрыть метку аргумента.

Смежные вопросы