Swift 可选项和相等运算符

Swift optionals and equality operator

正在寻找有关此特定行为的文档参考或名称或 link,这类似于可选绑定,但在文档的那部分没有讨论。

我可以使用 == 运算符测试可选值,并针对 nil 及其实际值进行测试,而无需进行任何显式展开:

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

这可以按您希望的那样编译和工作,但这里发生的是我不必显式解包 toggle!== 已经安全地为我完成了。

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

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:

Remove the versions of <, <=, >, and >= which accept optional operands.

Variants of == and != which accept optional operands are still useful, and their results unsurprising, so they will remain.

所以这按预期工作:

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

但是正如 matt 所指出的,这不能通过隐式展开来完成 可选项,这里左操作数将被展开:

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