Swift:如何将可编码类型作为函数输入传递给编码或解码 json

Posted

技术标签:

【中文标题】Swift:如何将可编码类型作为函数输入传递给编码或解码 json【英文标题】:Swift: How to pass a codable type as a function input to encode or decode json 【发布时间】:2022-01-21 18:41:51 【问题描述】:

我想做一个辅助函数,它接受可编码/可解码类型的输入,以便对 json 进行编码或解码。我试过了

static func loadCache<T:Decodable>(fileName:String, type:T)throws->T
        let data = try FileManager.loadCache(fileName: fileName)
        return try JSONDecoder().decode(T.self, from: data)
    

使用函数

let products = try loadCache(fileName: Product.cacheFileName(), type: [Product])

我收到错误Type '[Product].Type' cannot conform to 'Decodable'

将 this 传递给函数的正确方法是什么 谢谢

【问题讨论】:

你可以使用 T.type 和 [Product].self 但你不能使用这样的文件 你可以使用这样的文件:- ***.com/questions/24410881/… @NoorAhmedNatali FileManager.loadCache 是我自己的生成数据的自定义扩展。我应该在我猜的问题中提到这一点 【参考方案1】:

你很亲密。你的语法有点不正确。您想将类型作为值传递,而不是类型的值,所以这是您需要的签名:

static func loadCache<T:Decodable>(fileName:String, type: T.Type) throws -> T
                                                           ^^^^^

Swift 要求您非常明确地将类型作为值传递。需要添加.self:

let products = try loadCache(fileName: Product.cacheFileName(),
                             type: [Product].self)
                                            ^^^^^

【讨论】:

以上是关于Swift:如何将可编码类型作为函数输入传递给编码或解码 json的主要内容,如果未能解决你的问题,请参考以下文章

如何在可编码结构中使用计算属性(swift)

Swift 可编码解析 keyNotFound

Swift:枚举编码如何获取原始值[重复]

Swift 中可编码属性的 iOS 通用类型

在swift 4中调用Encoding类型的网络

多部分请求 - 带有 UIImage 的可编码结构