本文共 1146 字,大约阅读时间需要 3 分钟。
NSNull
出场最多的时候就是在JSON 解析
了。
在Objective-C 中
,因为NSDictionary
和NSArray
只能存储对象
,对于像JSON 中可能存在的null 值
,NSDictionary 和NSArray 中就只能用NSNull 对象
来表示
。Objective-C 中的nil
实在是太方便
了,我们向nil 发送任何消息时都将返回默认值,因此很多时候我们过于依赖这个特性,而不再去进行检查就直接使用对象。大部分时候这么做没有问题,但是在处理JSON 时,NSNull 却无法使用像nil 那样的对所有方法都响应的特性。而又因为Objective-C
是没有强制的类型检查
的,我们可以任意向对象发送任何消息,这就导致了,如果JSON 对象中存在null
(不论这是有意为之还是服务器方面出现了某种问题)的话,对其映射为的NSNull
直接发送消息时,App 将发生崩溃
。相信有过一定和后端协作的开发经验的读者,可能都遇到过这样的问题:
NSDictionary *jsonDic = @{ };NSInteger voteCount = [[jsonDic objectForKey:@"voteCount"] integerValue];// 如果在 JSON 中 voteCount 对应的是 null 的话// [NSNull intValue]: unrecognized selector sent to instance 崩溃
在Objective-C 中,我们一般通过严密的判断来解决这个问题:
两种方式都不是非常完美,前一种过于麻烦,后一种难免有疏漏。
而在Swift 中,这个问题被语言的特性彻底解决了。因为Swift 所强调的就是类型安全
,无论怎么说都需要一层转换
。因此除非我们故意不去将Any 转换
为我们需要的类型,否则我们绝对不会错误的向一个NSNull
发送消息。NSNull 会默默的通过Optional Binding
被转换为nil
,从而避免被执行:
// 假设 jsonValue 是从一个 JSON 中取出的 NSNulllet jsonValue: Any = NSNull()if let string = jsonValue as? String { print(string.hasPrefix("a"))} else { print("不能解析")}// 输出// 不能解析
转载地址:http://jrnuk.baihongyu.com/