3

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

if optionalValue != .None {   

... some code ...

}

或者

if optionalValue != nil {   

... some code ...

}

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

4

3 回答 3

8

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

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

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

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

var t: MyStruct = nil

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

于 2014-10-14T14:29:32.380 回答
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(尽管我不确定最后一点)。

于 2014-10-14T14:28:39.680 回答
0

没有区别,因为.none(基本上它是Optional.none) 并且nil彼此等价。

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

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

使用nil更常见,是推荐的约定。

于 2019-12-15T17:00:29.417 回答