【问题标题】:How do I track down the place in my swift code where I'm unwrapping an optional unsafely?如何在我的 swift 代码中找到不安全地打开可选选项的位置?
【发布时间】:2014-07-10 20:20:04
【问题描述】:

出现故障的地方代码直接来自Apple的Lister示例代码:

var window: UIWindow!

...

var splitViewController: UISplitViewController {

    return window.rootViewController as UISplitViewController
    }

当我尝试运行代码时,它给了我错误:“致命错误:在展开可选值时意外发现 nil”。通过使用断点,我可以看出在第一次运行时风仍然为零,但这对于直接示例项目来说不是问题。
由于它在示例代码中执行,似乎我在 splitview 的子视图之一中遇到了问题。我是否在考虑这一点,如果是这样,调试器中是否有一种好方法可以找到正在发生的事情,或者我的问题是哪个可选?

【问题讨论】:

  • 你试过打破异常吗?
  • 是的,它仍然在同一个地方以同样的方式失败。
  • 不,我的意思是打破异常以找到错误发生的位置!
  • 是的,我打开了异常断点。
  • 调试器应该已经停止错误。如果window 为nil,那么使用它是错误的,这就是隐式展开的选项的工作方式。你为什么不先检查一下,或者确保在配置窗口之前这段代码不会运行?

标签: xcode swift uisplitviewcontroller


【解决方案1】:

[编辑:我刚刚看到这个问题的年龄,但也许其他人会觉得它有用]

这只是一个猜测,但您应该检查窗口和插座之间的界面构建器连接。而且你必须在 windowDidLoad 被调用之前检查你是否访问了这个函数。

正如@jtbandes 所述,失败是隐式展开的可选选项为 nil 时所需的行为。 因此,您必须检查窗口是否为零,例如通过执行以下操作:

var splitViewController: UISplitViewController {
  return window?.rootViewController as UISplitViewController
}

我现在不知道如果这个函数返回 nil 会发生什么。我想您必须声明它以返回可选的 UISplitViewController 以使编译器静音。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2023-03-26
    相关资源
    最近更新 更多