无法调用带有可编码通用参数的函数

时间:2019-05-18 03:56:55

标签: swift generics

我有一个带有通用参数T class CacheRepository<T> {}的类,该类包含一个func transform()。如果func transformCodable<U: Codable>(ofType: U.Type)符合T协议,则需要在其中调用具有以下签名Codable的另一个函数。但是我没有这样做。下面是我的试验及其编译错误。

审判1:

func transform() {
    if T.self is Codable.Type {
        // Error: In argument type 'CacheRepository<T>.T.Type' (aka 'T.Type'), 'T' does not conform to expected type 'Decodable'
       sharedStorage!.transformCodable(ofType: T.self)
    }
}

试用2:

func transform() {
    if T.self is Codable.Type {
        //Cannot invoke 'transformCodable' with an argument list of type '(ofType: (Codable))'
        //Expected an argument list of type '(ofType: U.Type)'
        sharedStorage!.transformCodable(ofType: (T as! Codable).self)
    }
}

试用3:我尝试扩展CacheRepository类,如果T is Codable,但是在init()函数中调用扩展transform函数时,它永远不会被调用。而且,如果我在创建实例后调用了它,那么并不是在所有情况下都调用它。

class CacheRepository<T> {
    func transform() {
      print("non-codable transform")
    }
}

extension CacheRepository where T: Codable {
    func transform() {
     sharedStorage!.transformCodable(ofType: T.self)
    }
}

示例:可行

let transform = CacheRepository<Int>().transform()

但是,如果我在CacheRepository类中添加了一个共享实例,并在实例化后尝试调用transform,则不会调用该实例。真的很奇怪,如果我在控制台中的新实例上调用了tranform,就会调用右边的transform

1 个答案:

答案 0 :(得分:0)

这怎么样?

extension CacheRepository where T: Codable {
    func transform() {
        print("Codable")
        sharedStorage!.transformCodable(ofType: T.self)
    }
}
extension CacheRepository {
    func transform() {
        print("Non-codable")
    }
}

这在非常简化的CacheRepository中按预期工作。但不确定是否可以在您实际的CacheRepository中使用,请尝试。