首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速选择算子与等式算子

快速选择算子与等式算子
EN

Stack Overflow用户
提问于 2016-09-20 16:05:24
回答 1查看 4.5K关注 0票数 6

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

我可以使用==操作符测试一个可选的选项,并对nil和它的实际值进行测试,而无需执行任何显式的展开:

代码语言:javascript
复制
var toggle: Bool? = nil
if (toggle == true || toggle == nil) {
    // do something
}

这可以按您的意愿编译和工作,但是这里发生的情况是,我不必显式地展开toggle!==已经为我安全地完成了它。

这很方便,但我承认,当我注意到这件事时,我有点惊讶。这仅仅是默认==实现的行为吗?还是这里发生了其他语言方面的事情?谢谢你的洞察力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-20 16:20:23

Swift有一个相等的运算符,它接受两个选项值(基本类型相等):

代码语言:javascript
复制
public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

这个实现可以在Optional.swift上找到

代码语言:javascript
复制
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中删除了类似的比较运算符<等选择项,比较删除可选的比较运算符。

删除接受可选操作数的<、<=、>和>=的版本。 接受可选操作数的==和!=的变体仍然很有用,其结果并不令人惊讶,因此它们将保持不变。

因此,这项工作与预期的一样:

代码语言:javascript
复制
let b: Bool? = nil
print(b == true) // prints "false"

但正如matt指出的那样,这不能用隐式展开选项来完成,在这里,左操作数将被打开:

代码语言:javascript
复制
let b: Bool! = nil
print(b == true) // crashes
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39598902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档