我通过Swift 4 JSON Codable方法从API返回String值。
我知道很少有值" null"或者为零,所以为了避免崩溃,我试图实现代码。以下是给出主题错误的代码(在NSNull比较中):
if Cur[indexPath.row].cap == nil || Cur[indexPath.row].cap == NSNull {
print("Could not find the value")
CapVal = "N/A"
} else {
CapVal = Cur[indexPath.row].cap!
}
错误:
二元运算符' =='不能应用于' String?'类型的操作数?和' NSNull.Type
我也尝试将其转换为字符串:Cur[indexPath.row].cap as? String
仍然遇到同样的错误。
答案 0 :(得分:1)
如果您使用的是JSONDecoder
,则明确指定为null
的缺失值和值都将返回为nil
:
考虑这个JSON:
{"foo": "a", "bar": null}
这是struct
:
struct Result: Decodable {
var foo: String
var bar: String?
var baz: String?
}
如果您使用JSONDecoder
,则可以执行以下操作:
guard let result = try? JSONDecoder().decode(Result.self, from: data) else { ... }
let bar = result.bar ?? "N/A"
我知道您在Swift 4中询问Codable
,但仅供参考,如果您使用JSONSerialization
,理论上您可以测试null
,因为{{ 1}} 将JSONSerialization
值返回为null
:
NSNull
就个人而言,我只是选择强制转换为字符串并使用guard let json = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any] else { ... }
let bar = json["bar"]
if bar == nil || bar is NSNull {
// bar was either not found or `null`
} else {
// bar was found and was not `null`
}
合并运算符,如果转换失败,例如。
nil
但是,对于Swift 4' let bar = (json["bar"] as? String) ?? "N/A"
来说,这一切都没有用。