测试一个可选的" nil"之间的区别是什么?和"。没有"?

时间:2014-10-14 14:15:19

标签: ios swift optional-values

我用快速的语言随处可见,人们使用if语句测试可选值,以便他们可以通过两种方式安全地强制解包:

if optionalValue != .None {   

... some code ...

}

if optionalValue != nil {   

... some code ...

}

有什么不同之处,它能以某种方式以某种方式影响我的应用/代码吗? 什么更好?

3 个答案:

答案 0 :(得分:6)

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

.Nonenil的等效性归功于实施Optional<T>协议的NilLiteralConvertible类型,以及!=和{{1的重载运营商。

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

==

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

答案 1 :(得分:3)

如果您按住命令单击.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(尽管我不确定最后一点)。

答案 2 :(得分:0)

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

实际上,该语句在操场上运行,然后其输出为true

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

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