(转)NSNULL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(转)NSNULL相关的知识,希望对你有一定的参考价值。

参考技术A (王巍) 原文链接
NSNull 出场最多的时候就是在 JSON 解析了。

在 Objective-C 中,因为 NSDictionay 和 NSArray 只能存储对象,对于像 JSON 中可能存在的 null 值,NSDictionay 和 NSArray 中就只能用 NSNull 对象来表示。Objective-C 中的 nil 实在是太方便了,我们向 nil 发送任何消息时都将返回默认值,因此很多时候我们过于依赖这个特性,而不再去进行检查就直接使用对象。大部分时候这么做没有问题,但是在处理 JSON 时,NSNull 却无法使用像 nil 那样的对所有方法都响应的特性。而又因为 Objective-C 是没有强制的类型检查的,我们可以任意向一个对象发送任何消息,这就导致如果 JSON 对象中存在 null 时 (不论这是有意为之还是服务器方面出现了某种问题) 的话,对其映射为的 NSNull 直接发送消息时,app 将发生崩溃。相信有过一定和后端协作的开发经验的读者,可能都遇到过这样的问题:

在 Objective-C 中,我们一般通过严密的判断来解决这个问题:即在每次发送消息的时候都进行类型检查,以确保将要接收消息的对象不是 NSNull 的对象。另一种方法是添加 NSNull 的 category,让它响应各种常见的方法 (比如 integerValue 等),并返回默认值。两种方式都不是非常完美,前一种过于麻烦,后一种难免有疏漏。

而在 Swift 中,这个问题被语言的特性彻底解决了。因为 Swift 所强调的就是类型安全,无论怎么说都需要一层转换。因此除非我们故意犯二不去将 AnyObject 转换为我们需要的类型,否则我们绝对不会错误地向一个 NSNull 发送消息。NSNull 会默默地被通过 Optional Binding 被转换为 nil,从而避免被执行:

使 NSNull 符合 NilLiteralConvertible

【中文标题】使 NSNull 符合 NilLiteralConvertible【英文标题】:Making NSNull conform to NilLiteralConvertible 【发布时间】:2014-11-08 21:17:51 【问题描述】:

我试图让NSNull 符合NilLiteralConvertible,但我遇到了极大的挫折:

extension NSNull : NilLiteralConvertible

    required convenience init(nilLiteral: ())
        self.init()
    

首先,我不得不将 init 设为 convenience 一个,因为我无法在扩展中添加指定的初始化程序。

然后,编译器发疯了,坚持必须将 init 设为 required,然后立即抱怨必须将 required 初始化器直接添加到类中,而不是在扩展中。 WTF?!

有人知道发生了什么以及如何使NSNull 符合这个简单的协议吗?

我正在 Xcode 操场上对此进行测试。

【问题讨论】:

你的用例是什么? 【参考方案1】:

没有理由使NSNull 符合NilLiteralConvertible。尽管该协议是公开的,但它主要由 NSZone 内部使用,以及该语言中 Optionals 的实现(参见源代码 here 中的参考资料)。您只需将变量声明为Optional<NSNull>,即可获得所需的行为。 Optional 枚举符合NilLiteralConvertible,如Optional.swift 的来源所示:

这不起作用:

var null: NSNull

null = NSNull()  // <null>
null = nil // error: nil cannot be assigned to type 'NSNull'

但这确实:

var null: NSNull?

null = NSNull() // <null>
null = nil // nil

【讨论】:

以上是关于(转)NSNULL的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer知识点List转int[],List转String,String转int,char[]转String,String 转char[],List转String[]

剑指offer知识点List转int[],List转String,String转int,char[]转String,String 转char[],List转String[]

经纬度之间互相转换(高德转百度,高德转wgs84,百度转高德,百度转wgs84,wgs84转百度,wgs84转高德)

经纬度之间互相转换(高德转百度,高德转wgs84,百度转高德,百度转wgs84,wgs84转百度,wgs84转高德)

string转数组, 数组转ist, list转数组, 数组转string

图片转ascii网站(图像转字符图片转字符字符画字符图图像转ascii)