Swift:将泛型类型转换为协议

时间:2016-01-23 03:34:16

标签: swift generics

有没有办法告诉编译器泛型类型在运行时是否符合某些协议?

编译器无法知道它,但我知道它,因此我能够阻止我的库用户必须指定符合类型。

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是一个我刚刚扩展的类。

谢谢!

1 个答案:

答案 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)