使 NSNull 符合 NilLiteralConvertible

Posted

技术标签:

【中文标题】使 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 符合 NilLiteralConvertible的主要内容,如果未能解决你的问题,请参考以下文章

TouchJSON,处理 NSNull

(转)NSNULL

替换嵌套 NSDictionary 中出现的 NSNull

AFNetworking [NSNull 长度]

iOS中使用nil NULL NSNULL的区别

iOS中使用nil NULL NSNULL的区别