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
中的_
来隐藏参数标签。