【问题标题】:Swift: App crashing with fatal error: unexpectedly found nil while unwrapping an Optional value?Swift:应用程序因致命错误而崩溃:在展开可选值时意外发现 nil?
【发布时间】:2014-08-08 10:38:41
【问题描述】:

我在 Stack 上查看了许多其他具有相同错误的其他错误(致命错误:在展开可选值时意外发现 nil?),但我不明白在我的场景中什么可能等于 nil,因为有这么多正在崩溃的线上进行。

实际的异常是“线程 1:EXC_BAD_INSTRUCTION(代码=EXC_1386_INVOP,子代码=0x0”,它在下面指示的行上崩溃。我不确定 Bool、playsspot 是否等于无。当我单击线程 1 下的栏时,其他 3 行也会出现同样的错误。

这些后续行都涉及isOccupied 函数,而后者又涉及这一行。我在想我解决了第一个错误,其他错误将得到解决。

介绍plays的代码块:

    var plays = Dictionary<Int,Int>()
    var done = false
    var aiDeciding = false

错误在哪里:

func isOccupied(spot:Int)->(Bool) {
        return Bool(plays[spot]!) //ERROR LINE
    }

改成这样:

func isOccupied(spot:Int)->(Bool) {
        if plays != nil {
        return Bool(plays[spot]!)
        }
        else {
            return false
        }
    }

【问题讨论】:

  • 设置断点并检查调试器中的变量?将一行分成几行?

标签: ios swift


【解决方案1】:

Dictionary 的下标函数将返回一个Optional(在本例中为Int?),而不管键类型如何。这是因为您可能正在请求一个不存在的密钥。来自docs

因为可以请求一个不存在值的键,所以 字典的下标返回字典的可选值 值类型。

你会想做这样的事情:

func isOccupied(spot: Int) -> Bool {
    if let doesPlay = plays[spot] {
        return Bool(doesPlay)
    } else {
        return false // assuming that's a sane default
    }
}

【讨论】:

  • 所以我将 isOccupied 函数更改为上述函数(查看我原来的问题),现在我在 App Delegate 文件的 class AppDelegate 行上遇到了同样的异常。这是什么意思?
  • 问题不在于plays 为nil,问题在于plays[sport] 返回的内容。这就是为什么我要做 let doesPlay = ... 而不仅仅是先检查 play 是否为 nil。
  • 所以我的函数中没有像你的 dosPlay 这样的变量,所以我该怎么做你的建议?我应该只创建一个变量吗?
  • let doesPlay = plays[sport] 部分正在创建 doesPlay 变量。请参阅language guide 中的“可选绑定”部分。
  • 对不起,是的,我在评论后几秒钟才意识到。所以我这样做了,它修复了异常,除了我在 else 部分返回的部分对其余代码没有任何意义,所以应用程序不起作用。你能看看我发布的新问题吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 2015-03-04
相关资源
最近更新 更多