我正在努力使NSNull
符合NilLiteralConvertible
,但我遇到了很大的挫败感:
extension NSNull : NilLiteralConvertible{
required convenience init(nilLiteral: ()){
self.init()
}
}
首先,我被迫制作init
一个convenience
,因为我无法在扩展程序中添加指定的初始化程序。
然后,编译器变得疯狂并且坚持必须在required
之后立即生成init,并且在抱怨必须将required
初始化程序直接添加到类而不是扩展名中之后。 WTF?!
有人知道发生了什么以及如何使NSNull
符合这个简单的协议吗?
我正在Xcode游乐场测试这个。
答案 0 :(得分: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