使NSNull符合NilLiteralConvertible

时间:2014-11-08 21:17:52

标签: cocoa swift protocols swift-playground nsnull

我正在努力使NSNull符合NilLiteralConvertible,但我遇到了很大的挫败感:

extension NSNull : NilLiteralConvertible{

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

首先,我被迫制作init一个convenience,因为我无法在扩展程序中添加指定的初始化程序。

然后,编译器变得疯狂并且坚持必须在required之后立即生成init,并且在抱怨必须将required初始化程序直接添加到类而不是扩展名中之后。 WTF?!

playground

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

我正在Xcode游乐场测试这个。

1 个答案:

答案 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