繁体   English   中英

测试“nil”和“.None”的可选项有什么区别?

[英]What's the difference between testing an optional for “nil” and “.None”?

我在 swift 语言中到处都看到,人们使用 if 语句测试可选值,以便他们可以通过两种方式安全地强制解包:

if optionalValue != .None {   

... some code ...

}

或者

if optionalValue != nil {   

... some code ...

}

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

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

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

如果您希望 nil 可分配,您可以在您自己的类/结构/枚举中实现该协议,例如:

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更常见,并且是推荐的约定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM