Swift选项和等式运算符

时间:2016-09-20 16:05:24

标签: swift operators optional

在此特定行为上查找文档引用或名称或链接,这类似于可选绑定,但未在文档的该部分中讨论。

我可以使用==运算符测试一个可选项,并针对nil及其实际值进行测试,而不进行任何明确的解包:

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

这可以按照您的要求进行编译和工作,但这里发生的是我没有必要明确地展开toggle!; ==为我安全地完成了它。

这很方便,但是当我注意到它时,我承认有点惊讶。这只是默认==实现的行为吗?或者是语言中发生的其他事情?感谢您的见解。

1 个答案:

答案 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