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
正在寻找有关此特定行为的文档参考或名称或 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