有没有办法告诉编译器泛型类型在运行时是否符合某些协议?
编译器无法知道它,但我知道它,因此我能够阻止我的库用户必须指定符合类型。
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
}
}
我无法修改通用类型&#39;元素(E)&#39;为了符合Mappable协议,因为Observable是一个我刚刚扩展的类。
谢谢!
答案 0 :(得分:0)
条件协议一致性可能是您的解决方案。
由于您的cacheInternal(provider:)
函数需要符合Mappable
协议,因此只应针对类型Observable
扩展此函数,其类型E
符合Mappable
where
。这可以通过扩展声明中的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
中的SELECT
menu_item_id, tax_amt_incl_sales, [Order_Header].check_no
FROM
[it_trn].[dbo].[Order_Item]
INNER JOIN
[it_trn].[dbo].[Order_Header]
ON
[Order_Header].[order_hdr_id] = [Order_Item].[order_hdr_id]
WHERE
bus_day_id = 179 AND
[Order_Header].check_no IN (20412, 20410, 20409)
。