1

我试图使NSNull符合NilLiteralConvertible,但我遇到了巨大的挫败感:

extension NSNull : NilLiteralConvertible{

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

首先,我不得不做init一个convenience,因为我不能在扩展中添加指定的初始化程序。

然后,编译器发疯并坚持必须进行初始化required,并且在抱怨required必须将初始化程序直接添加到类而不是扩展之后立即进行。怎么回事?!

操场

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

我正在 Xcode 操场上对此进行测试。

4

1 回答 1

1

应该没有理由NSNull遵守NilLiteralConvertible. 尽管该协议是公开的,但它主要由NSZone该语言在内部使用和实现 Optionals(请参阅此处的源代码中的参考资料)。您只需将变量声明为 即可获得所需的行为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
于 2016-02-26T18:22:03.910 回答