(转)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转高德)