Swift:将通用类型转换为协议

问题描述:

有没有办法告诉编译器,通用类型将在运行时符合特定协议?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 
    } 
} 

而且我不能修改泛型类型'Element(E)'以符合可映射协议,因为Observable是我正在扩展的类。

谢谢!

有条件的协议一致性可能是您的解决方案。

由于您cacheInternal(provider:)功能需要符合的Mappable协议,此功能只应延长与通用型E符合Mappable类型Observable的。为了正确测试它,我已经更新了代码,斯威夫特3:这可以通过在扩展声明一个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 
    } 
} 

注脚。 (目前无法在2.x上测试)我猜这只是cacheInternal中的_来隐藏参数标签。