不知道你为什么需要这个,因为通常不会对解码失败的形式进行编码。
尽管如此,如果您发现自己在多个地方都需要这种逻辑,您可以KeyedEncodingContainer
使用这种功能进行扩展:
extension KeyedEncodingContainer {
mutating func encodeOptional<T: Encodable>(_ value: T?, forKey key: Self.Key) throws {
if let value = value { try encode(value, forKey: key) }
else { try encode([String:String](), forKey: key) }
}
}
,然后实现中的encode(to:)
方法Foo
:
struct Foo: Encodable {
let id = 10
let bar: Bar? = nil
enum CodingKeys: String, CodingKey {
case id
case bar
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encodeOptional(bar, forKey: .bar)
}
}
如果您发现自己需要为其他类型的容器中的 nil 值编码空 JSON 对象,您也可以使用类似的方法UnkeyedDecodingContainer
进行扩展SingleValueDecodingContainer
。encodeOptional