【发布时间】:2021-12-26 21:53:35
【问题描述】:
我使用property wrapper 将字符串“true”和“false”解码为布尔值。我还想让密钥成为可选的。因此,如果 JSON 中缺少密钥,则应将其解码为 nil。不幸的是,添加属性包装器会破坏这一点,而是抛出 Swift.DecodingError.keyNotFound。
@propertyWrapper
struct SomeKindOfBool: Decodable {
var wrappedValue: Bool?
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if let stringifiedValue = try? container.decode(String.self) {
switch stringifiedValue.lowercased() {
case "false": wrappedValue = false
case "true": wrappedValue = true
default: wrappedValue = nil
}
} else {
wrappedValue = try? container.decode(Bool.self)
}
}
}
public struct MyType: Decodable {
@SomeKindOfBool var someKey: Bool?
}
let jsonData = """
[
{ "someKey": true },
{ "someKey": "false" },
{}
]
""".data(using: .utf8)!
let decodedJSON = try! JSONDecoder().decode([MyType].self, from: jsonData)
for decodedType in decodedJSON {
print(decodedType.someKey ?? "nil")
}
知道如何解决这个问题吗?
【问题讨论】:
-
@SPatel 这个服务不使用属性包装器,所以它不是很有帮助。
-
如果将 someKey 的类型更改为非可选会发生什么?
-
同样的错误。然后我再也无法区分 false 和 nil(也就是不存在)。
-
好的,我尝试运行你的代码,但它在你的 json 中的最后一个条目上失败,
{},我不确定它应该是什么?下次您发布错误消息时,请发布完整消息。 -
你试过用
decodeIfPresent代替吗?
标签: swift decodable property-wrapper