在此特定行为上查找文档引用或名称或链接,这类似于可选绑定,但没有在文档的该部分中讨论。
我可以使用==操作符测试一个可选的选项,并对nil和它的实际值进行测试,而无需执行任何显式的展开:
var toggle: Bool? = nil
if (toggle == true || toggle == nil) {
// do something
}这可以按您的意愿编译和工作,但是这里发生的情况是,我不必显式地展开toggle!;==已经为我安全地完成了它。
这很方便,但我承认,当我注意到这件事时,我有点惊讶。这仅仅是默认==实现的行为吗?还是这里发生了其他语言方面的事情?谢谢你的洞察力。
发布于 2016-09-20 16:20:23
Swift有一个相等的运算符,它接受两个选项值(基本类型相等):
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中删除了类似的比较运算符<等选择项,比较删除可选的比较运算符。
删除接受可选操作数的<、<=、>和>=的版本。 接受可选操作数的==和!=的变体仍然很有用,其结果并不令人惊讶,因此它们将保持不变。
因此,这项工作与预期的一样:
let b: Bool? = nil
print(b == true) // prints "false"但正如matt指出的那样,这不能用隐式展开选项来完成,在这里,左操作数将被打开:
let b: Bool! = nil
print(b == true) // crasheshttps://stackoverflow.com/questions/39598902
复制相似问题