【发布时间】:2020-07-28 18:21:36
【问题描述】:
假设我有以下可解码结构作为示例,说明我正在尝试做什么:
struct Object: Decodable {
var id: String
var name: String
}
还有这个 JSON:
[
{
"id": "a",
"name": "test"
},
{
"id": "b",
"name": null
}
]
请注意,名称属性有时可以是null。这通常可以正常工作,因为 json 键与结构属性名称匹配,所以我不需要 CodingKey 枚举,但 name 属性有时可以为空。但是,我不想将name 设为可选,而是替换为默认字符串,因此我需要一个自定义初始化程序:
struct Object: Decodable {
var id: String
var name: String
init(from decoder: Decoder) throws {
...
self.name = <value from decoder> ?? "default name"
...
}
}
但这需要一个CodingKey 对象。我正在使用默认键。我现在还需要CodingKey 枚举吗?即使我所有的钥匙都匹配?或者有没有办法让自定义 Decodable 初始化器只使用键?
我可以使用某种默认容器吗?
let container = try decoder.container(keyedBy: <defaultContainer???>)
我尝试使用这两种变体,但都不起作用:
让容器 = 尝试解码器.singleValueContainer()
let container = try decoder.unkeyedContainer()
我怎样才能有一个自定义的 Decodable 初始化器但也使用默认键?
【问题讨论】:
-
你不能只使用为你制作的编译器
Object.CodingKeys吗? -
仅当
Codable被使用时,而不仅仅是其组成部分之一。 -
@Alexander-ReinstateMonica 除非我遗漏了什么,否则它似乎不可用。尝试获取
self.CodingKeys或Object.CodingKeys给出“类型没有成员 'CodingKeys'” -
@Jessy,你是对的。只要我符合 Codable,我就可以使用 Object.CodingKeys.self,或者只是 CodingKeys.self 来创建容器。我想我必须遵守 Codable 。知道这是为什么吗?您应该使用您的信息创建一个答案。