Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JSON返回的值与NSNull不可比?_Json_Swift_Binary Operators - Fatal编程技术网

为什么JSON返回的值与NSNull不可比?

为什么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为例: {"

我通过Swift 4 JSON可编码方法从API返回字符串值

我知道很少有值是“null”或nil,所以为了避免崩溃,我尝试实现代码。以下是给出主题错误的代码(在NSNull比较中):

错误:

二进制运算符“==”不能应用于“String”和“NSNull.type”类型的操作数


我也尝试将其转换为字符串:
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"