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