【问题标题】:Swift two question marks optional chainingSwift 两个问号可选链
【发布时间】:2016-02-09 12:19:35
【问题描述】:

我正在尝试一些带有可选链接和两个问号的东西,但我无法理解一件事。我有这部分代码:

if let delegate = self.delegate {
    delegate.webViewControllerDidCancel()
}
else {  
    self.navigationController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
}

这很好。完全符合我的要求。如果有人符合协议,请拨打webViewControllerDidCancel,否则只需拨打dismissViewController

但是,我尝试以这种方式做同样的事情

self.delegate?.webViewControllerDidCancel() ?? self.navigationController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

这对我来说似乎合法并且也有效,但 XCode 给了我一个黄色感叹号,说

调用 '??' 的结果没用过

我想不通。这是 ??甚至应该以这种方式工作?

【问题讨论】:

  • 如果–webViewControllerDidCancel 返回void 或其他不可评估的东西,这似乎不合法。
  • 是的,它是无效的。所以这可能是警告的原因。无论如何,最终使用了更长的版本,但我必须说这也有效(不确定副作用)

标签: ios xcode swift swift2


【解决方案1】:

在我看来,?? 运算符设计用于在使用可选项时设置变量,尽管它似乎确实可以作为控制触发哪个函数的机制 - 这不是它的直接预期用途。来自documentation

nil 合并运算符是以下代码的简写:

a != nil ? a! : b

nil 合并运算符提供了一种更优雅的方式来以简洁易读的形式封装这种条件检查和展开。

文档中的所有示例也都与变量相关,因此虽然操作符的功能确实适合您的用例 - Xcode 的警告与您未将操作符用于假定的预期用途有关。

【讨论】:

  • 感谢您的回复,可能是 nil 合并运算符希望在左侧进行一些分配,当它与函数一起使用时,这不会发生。
  • 当然,我同意 - 错误消息非常表明希望您使用运算符对表达式的结果执行某些操作。我会假设像你一样使用它,如果有的话,副作用很小。
猜你喜欢
  • 1970-01-01
  • 2016-11-17
  • 2017-07-08
  • 2020-06-19
  • 2020-08-15
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多