首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使用可编码的泛型参数调用函数

无法使用可编码的泛型参数调用函数
EN

Stack Overflow用户
提问于 2019-05-18 11:56:55
回答 1查看 38关注 0票数 0

我有一个类,它接受一个包含func transform()的泛型参数Tclass CacheRepository<T> {}。其中,如果T符合Codable协议,则需要调用另一个具有以下签名func transformCodable<U: Codable>(ofType: U.Type)的函数。但我没有做到这一点。下面是我在测试中遇到的编译错误。

试验1:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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:我试图在T is Codable的情况下扩展CacheRepository类,但是当在init()函数中调用时,扩展transform函数永远不会被调用。如果我在实例创建之后调用它,它并不是在所有情况下都会被调用。

代码语言:javascript
运行
复制
class CacheRepository<T> {
    func transform() {
      print("non-codable transform")
    }
}

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

示例:这是可行的

代码语言:javascript
运行
复制
let transform = CacheRepository<Int>().transform()

但是,如果我在CacheRepository类中添加了一个共享实例,并试图在实例化后调用transform,则不会调用它。真正奇怪的是,如果我在console中的新实例上调用tranform,就会调用正确的transform

EN

回答 1

Stack Overflow用户

发布于 2019-05-18 13:25:50

这怎么回事?

代码语言:javascript
运行
复制
extension CacheRepository where T: Codable {
    func transform() {
        print("Codable")
        sharedStorage!.transformCodable(ofType: T.self)
    }
}
extension CacheRepository {
    func transform() {
        print("Non-codable")
    }
}

这在一个非常简单的CacheRepository中就像预期的那样工作。但不确定它是否能在您的实际CacheRepository中工作,请尝试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56195840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档