gpt4 book ai didi

json - 无法使用类型为“(Codable.Type?

转载 作者:行者123 更新时间:2023-11-30 10:52:33 25 4
gpt4 key购买 nike

我正在重构(尝试)前同事编写的一些网络代码,并且我想使用新的 JSONDecoder

他的网络代码被包装到函数getData中:

func getData(modelToReturn:Proto.Type, configuredRequest:URLRequest) {

正如你从签名中看到的,在这个方法中你可以指定要返回的模型(即哪个模型应该反序列化检索到的 JSON:我不能说得更好,我希望你能理解:-) )。

在这种情况下,Proto 是任何模型都遵循的协议(protocol)。

例如。

struct GroceryModel:Proto{
//...
}

然后以这种方式调用该方法:

net.getData(modelToReturn: GroceryModel.self, configuredRequest: grocery)

调用后,GroceryModel.self 被分配给 net 类的成员 (memberToReturn:Proto.Type?),然后JSON 测试了与具有可失败初始化器的模型结构的一致性:

 if let instance = modelToReturn?.init(json:jsonResult){...

我使用以下协议(protocol)进行了一些测试:

struct Test: Codable {
let name: String
let testers: [String]
}

我用这一行替换了大部分原始代码:

let test = try? JSONDecoder().decode(modelToReturn, from: jsonData)

我的想法是将 Codable.self 作为 getData 函数的第一个参数传递,但在最后一行出现错误:

Cannot invoke 'decode' with an argument list of type '(Codable.Type?, from: Data)'

那么,如何正确传递我的模型,以便可以从 decode 函数中使用它?

我必须说,我通过简单地将 modelToReturn 替换为 Test.self 来手动测试该行,错误就消失了。

最佳答案

您可以使用如下所示的泛型。

protocol Proto {
}

struct Test: Codable, Proto {
let name: String
let testers: [String]
}

func getData<T>(type: T.Type, configuredRequest:URLRequest?) where T : Decodable {
let data = """
{
"name": "a test",
"testers": ["mike", "bob"],
}
""".data(using: .utf8)!
let test = try? JSONDecoder().decode(type, from: data)
debugPrint(test)
}

getData(type: Test.self, configuredRequest: nil)
<小时/>

已编辑。

正如所评论的,您希望 Type 成为具有 getData 的类的成员。在这种情况下,您可以将泛型应用于类定义,如下所示。

class DataFetcher<T> where T: Decodable {
func getData(configuredRequest:URLRequest?) {
let data = """
{
"name": "a test",
"testers": ["mike", "bob"],
}
""".data(using: .utf8)!
let test = try? JSONDecoder().decode(T.self, from: data)
debugPrint(test)
}
}

DataFetcher<Test>().getData(configuredRequest: nil)

关于json - 无法使用类型为“(Codable.Type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54310286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com