2016-09-20 82 views
2

尋找這個特定行爲的文檔參考或名稱或鏈接,這與可選綁定類似,但在該文檔的該部分沒有提及。Swift optionals and equality operator

我可以測試可選與==運營商和測試對陣雙方nil和其實際價值,而不做任何明確的解包:

var toggle: Bool? = nil 
if (toggle == true || toggle == nil) { 
    // do something 
} 

這編譯並能達到您想要它,但這裏發生的事情是我沒有明確解開toggle!; ==已經安全地爲我完成了。

這很方便,但我承認當我注意到它時有點驚訝。這只是默認的==實施的行爲?或者是在這裏發生的其他語言?感謝您的見解。

+2

如果你用命令點擊'==',那麼你會看到有一個'public func == (lhs:T?,rhs:T?) - > Bool',它有兩個可選項操作數。 –

+0

的確,但爲什麼要這樣呢?這是語言設計中的哲學嗎?或者只是一種便利?或者我在想這個太難了? –

+3

我覺得這很方便。比較運算符在Swift 3中刪除了可選項:https://github.com/apple/swift-evolution/blob/master/proposals/0121-remove-optional-comparison-operators.md。但是平等運算符依然存在:*「接受可選操作數的變體==和!=仍然有用,它們的結果並不令人驚訝,所以它們將保持不變。」* –

回答

5

斯威夫特具有相等運算符接受兩個自選值 (一Equatable基本類型):

public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool 

的實施可以在Optional.swift發現:

public func == <T: Equatable>(lhs: T?, rhs: T?) -> Bool { 
    switch (lhs, rhs) { 
    case let (l?, r?): 
    return l == r 
    case (nil, nil): 
    return true 
    default: 
    return false 
    } 
} 

和它做什麼,一會預計:如果操作數 均爲nil,或者它們都不是nil和展開的 值相等,則操作數相等。

類似的比較運算符<等服用自選已經 在夫特3除去,比較 SE-0121 Remove Optional Comparison Operators

刪除<,< =,>,和> =其版本接受可選操作數。

接受可選操作數的變體==和!=仍然有用,它們的結果並不令人吃驚,因此它們將保持不變。

所以這按預期工作:

let b: Bool? = nil 
print(b == true) // prints "false" 

但正如馬特指出,這不能用做隱含解開 自選,這裏左操作數將被解開:

let b: Bool! = nil 
print(b == true) // crashes 
+1

警告:不要試圖與隱式解包可選。可怕的事情(tm)會發生。 – matt