【问题标题】:Optional Chaining Not Working As Expected可选链未按预期工作
【发布时间】:2014-12-03 10:24:51
【问题描述】:

我的 UIViewController 子类中有以下代码

class SideMenu: UIViewController {

  var contentViewController: UIViewController?

   override func shouldAutorotate() -> Bool {

        return contentViewController?.shouldAutorotate()

    }
}

但由于某种原因,我收到以下错误:

可选类型 'Bool?' 的值未拆封;你的意思是用'!'或'??'

我希望可选链解开可选链,但这似乎不是真的?我错了吗?

【问题讨论】:

  • 如果 contentViewController 为 nil,您的函数将返回 nil,是否将返回类型设为 Bool?或使用 if let 构造进行测试,在 contentVC = nil 情况下返回 false

标签: ios swift


【解决方案1】:

可选链的结果是可选的。所以?.shouldAutorotate() 产生一个Bool? 而你的函数需要一个Bool。因此错误:

可选类型 'Bool?' 的值未拆封;你的意思是用'!'或'??'

错误概述了两种可能的解决方案。一种是使用contentViewController!.shouldAutorotate()contentViewController?.shouldAutorotate()! 解包,但如果contentViewControllernil,这两种方法都会崩溃,这不是您的想法。

另一个选项是提供一个备用值,以防您的Bool?nil。有一个很好的链接运算符:??,它在左侧采用 T?,在右侧采用 T

也就是说,如果您想在 contentViewController 为 nil 时返回 false,您将返回以下内容:

return contentViewController?.shouldAutorotate() ?? false

这实际上与以下代码的行为相同:

if let controller = contentViewController {
    return controller.shouldAutorotate()
} else { 
    return false
}

【讨论】:

  • 感谢您的快速回复!
猜你喜欢
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多