当JSONSerialiser
用于包含Optional
属性的encode
和Encodable
时,nil
值从编码中被省略,潜在地导致完全空的(并且漂亮而紧凑的) struct .以下是这类行为的XCTestCase
分:
func test_whenNilValueIsSerialised_thenItIsOmitted() throws {
struct Container: Codable {
let cargo: Int?
}
let encoding = try XCTUnwrap(String(bytes: JSONEncoder().encode(Container(cargo: nil)), encoding: .utf8))
XCTAssertEqual(encoding, "{}")
}
但是,如果Container
是泛型,并且使用包装类型实例化为可选类型,则不会发生这种行为.以下测试用例失败:
func test_whenNilValueFromGenericIsSerialised_thenItIsOmitted() throws {
struct Container<Cargo: Codable>: Codable {
let cargo: Cargo
}
let container = Container<String?>(cargo: nil)
let encoding = try XCTUnwrap(String(bytes: JSONEncoder().encode(container), encoding: .utf8))
XCTAssertEqual(encoding, "{}")
}
失败错误为:
XCTAssertEquity失败:("{"Cargo":Null}")不等于("{}")
The Question:是否有合理的干净工作来解决这一问题,也许是通过为Container
实现显式的encode(to:)
?
注:在这种情况下,以下解决方案不合适:
struct Container<Cargo: Codable>: Codable {
let cargo: Cargo?
}
…我希望能够在许多情况下使用非可选的Cargo
.