在此特定行为上查找文档引用或名称或链接,这类似于可选绑定,但未在文档的该部分中讨论。
我可以使用==
运算符测试一个可选项,并针对nil
及其实际值进行测试,而不进行任何明确的解包:
var toggle: Bool? = nil
if (toggle == true || toggle == nil) {
// do something
}
这可以按照您的要求进行编译和工作,但这里发生的是我没有必要明确地展开toggle!
; ==
为我安全地完成了它。
这很方便,但是当我注意到它时,我承认有点惊讶。这只是默认==
实现的行为吗?或者是语言中发生的其他事情?感谢您的见解。
答案 0 :(得分:6)
Swift有一个等于运算符的两个选项值 (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
而且是未包装的
价值相等。
类似的比较运算符<
等采取了选项
在Swift 3中删除,比较
SE-0121 Remove Optional Comparison Operators:
删除接受可选操作数的&lt;,&lt; =,&gt;和&gt; =的版本。
接受可选操作数的==和!=的变量仍然有用,它们的结果并不令人惊讶,因此它们将保留。
所以这可以按预期工作:
let b: Bool? = nil
print(b == true) // prints "false"
但正如马特指出的那样,这是不可能通过隐式展开来完成的 选项,这里左操作数将被解包:
let b: Bool! = nil
print(b == true) // crashes