测试"nil"和".None"的可选有什么区别?



我在swift语言中随处可见,人们用if语句测试可选值,以便可以通过两种方式安全地强制展开:

if optionalValue != .None {   
... some code ...
}

if optionalValue != nil {   
... some code ...
}

有什么区别?它会以任何方式影响我的应用程序/代码吗?什么更好?

在正常使用中没有区别,它们是可互换的。.None是由Optional<T>枚举实现的nil(不存在)值的枚举表示。

.Nonenil的等效性要归功于实现NilLiteralConvertible协议的Optional<T>类型,以及!===运算符的过载。

如果您希望nil是可赋值的,那么您可以在自己的类/structs/enums中实现该协议,例如:

struct MyStruct : NilLiteralConvertible {
    static func convertFromNilLiteral() -> MyStruct {
        return MyStruct() // <== here you should provide your own implementation
    }
}
var t: MyStruct = nil

(注意,变量未声明为可选)

如果命令单击单词.None,答案很容易得到。以下是Swift软件包显示的内容:

enum Optional<T> : Reflectable, NilLiteralConvertible {
    case None
    case Some(T)
    init()
    init(_ some: T)
    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> MirrorType
    static func convertFromNilLiteral() -> T?
}

因此,在大多数情况下,您可以使用任意一个,因为可选值应该符合协议NilLiteralConvertible(尽管我不确定最后一点)。

没有区别,因为.none(基本上是Optional.none)和nil是等价的。

事实上,这个语句在操场上运行,然后它的输出是true:

nil == .none || print(nil == .none) -> true

nil的使用更为常见,是推荐的惯例。

最新更新