为什么JSON返回的值与NSNull不可比?
我通过Swift 4 JSON可编码方法从API返回字符串值 我知道很少有值是“null”或nil,所以为了避免崩溃,我尝试实现代码。以下是给出主题错误的代码(在NSNull比较中): 错误: 二进制运算符“==”不能应用于“String”和“NSNull.type”类型的操作数为什么JSON返回的值与NSNull不可比?,json,swift,binary-operators,Json,Swift,Binary Operators,我通过Swift 4 JSON可编码方法从API返回字符串值 我知道很少有值是“null”或nil,所以为了避免崩溃,我尝试实现代码。以下是给出主题错误的代码(在NSNull比较中): 错误: 二进制运算符“==”不能应用于“String”和“NSNull.type”类型的操作数 我也尝试将其转换为字符串:Cur[indexPath.row].cap-as?字符串仍然出现相同的错误。如果使用的是jsondeconder,则缺少的值和显式指定为null的值都将返回为nil: 以JSON为例: {"
我也尝试将其转换为字符串:
Cur[indexPath.row].cap-as?字符串仍然出现相同的错误。如果使用的是jsondeconder
,则缺少的值和显式指定为null
的值都将返回为nil
:
以JSON为例:
{"foo": "a", "bar": null}
这个结构是:
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
,因为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
合并操作符,例如
let bar = (json["bar"] as? String) ?? "N/A"
但是,对于Swift 4的jsondeconder
来说,这都是没有意义的。为什么要将Swift可选项与NSNull
进行比较?我想在值返回null时为变量赋值。因此,我没有崩溃,而是得到了“N/A”字符串。可选字符串不能返回NSNull
。。。如果它没有值,它将返回nil
。那么,当JSON中的键有空值时,为什么我会崩溃呢?首先,学习如何处理optionals。检查nil
,否则使用强制展开是不可取的。此外,在你的问题中加入a。嗨,罗布,谢谢你的帮助。我实现了-let bar=result.bar??“不适用”-在代码中,效果很好。谢谢!
let bar = (json["bar"] as? String) ?? "N/A"