gpt4 book ai didi

swift - Codable/Decodable 应该用字符串解码数组

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:47 26 4
gpt4 key购买 nike

为什么名称数组没有解码?

为 Playground 准备,简单地将其粘贴到您的 Playground

import Foundation

struct Country : Decodable {

enum CodingKeys : String, CodingKey {
case names
}

var names : [String]?
}

extension Country {
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
names = try values.decode([String]?.self, forKey: .names)!
}
}

let json = """
[{
"names":
[
"Andorre",
"Andorra",
"アンドラ"
]
},{
"names":
[
"United Arab Emirates",
"Vereinigte Arabische Emirate",
"Émirats Arabes Unis",
"Emiratos Árabes Unidos",
"アラブ首長国連邦",
"Verenigde Arabische Emiraten"
]
}]
""".data(using: .utf8)!

let decoder = JSONDecoder()
do {
let countries = try decoder.decode([Country].self, from: json)
countries.forEach { print($0) }
} catch {
print("error")
}

最佳答案

您已将names 定义为Country可选 属性。如果您的意图是此 key 可能不存在于 JSON 中然后使用decodeIfPresent:

extension Country {
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
names = try values.decodeIfPresent([String].self, forKey: .names)
}
}

如果容器没有与键关联的值,或者值为 null,则此方法返回 nil

但实际上你可以省略你的自定义 init(from decoder: Decoder)实现(和 enum CodingKeys),因为这是默认行为并且将自动合成。

备注:在任何catch子句中定义了一个隐式变量error,所以

} catch {
print(error.localizedDescription)
}

可以提供更多信息,而不仅仅是 print("error")(尽管不是在这种特殊情况下)。

关于swift - Codable/Decodable 应该用字符串解码数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45005742/

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