斯坦福计算器应用程序崩溃并出现错误 "unexpectedly found nil"

Stanford calculator app crashes with error "unexpectedly found nil"

我是编程新手,我已经开始在 iTunes U 上学习斯坦福课程以制作 iPhone 8 应用程序。他们使用 Xcode 6 和 Swift 1,而我在 El Capitan 使用 Xcode 7 和 Swift 2。我发现代码有一些差异 Xcode 已经能够接受并帮助我更正(例如 "println" 现在是 "print"),但是我在代码的一个特定部分被绊倒了:

   var displayValue: Double {
    get {
        return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
    }
    set {
        display.text = "\(newValue)"
        userIsInTheMiddleOfTypingANumber = false
    }
}

我仔细检查了好几次,以确保这正是老师写的。他的构建正确且运行正常,而我的构建正确,但在我尝试操作它时显示此致命错误,"unexpectedly found nil while unwrapping an Optional value"(有关所有详细信息,请参见屏幕截图)。

Screenshot of the error

我在互联网上四处寻找并找到了一些类似的示例,包括本网站 () 上的一个示例,但在尝试了所有建议之后,我得出结论,某些东西在我的系统中一定是独一无二的或者我在一个新的 Xcode/Swift 环境中操作,而不是其他有此问题的人。 None 的解决方案解决了问题,并且都添加了自己的错误。

在回答其他人的问题时,有人建议我们使用此代码来确保如果 "display" 返回 "nil",它将提供“0”:

return (NSNumberFormatter().numberFromString(display.text) as? Double) ?? 0

我试过了,但它只给了我更多的错误,有些似乎与 Swift 2 有关(它需要在 double 后加一个逗号,要我打开 display.text,并抱怨说缺少预期的表达式——也许建议的代码在 Swift 1??) 中是好的。

I've double checked several times to make sure this is exactly how the teacher wrote it. His built correctly and functioned correctly, while mine builds correctly, but shows this fatal error when I try to operate it, "unexpectedly found nil while unwrapping an Optional value"

我怀疑 display 是一个 IBOutlet 属性 需要连接到用户界面中的某些东西,可能是一个文本字段。如果它没有连接,那么即使你的代码完全一样,当你尝试使用它的 text 属性 时你会得到 nil 并且解包会导致你的错误'重新看到。

不管上面的建议是否真的解决了你的问题,你真正需要做的是在崩溃发生的地方之前一两行设置一个断点,然后单步执行代码。查看涉及的变量并找出 nil 值的来源。您可以从那里向后工作并弄清楚为什么您期望不是 nil 的东西实际上是 nil。学习以这种方式工作将帮助您在出现此类问题时解决这些问题(而且它们再次出现)。

不确定您现在是否找到了答案,但我 运行 今天早上遇到了类似的问题,我想我会分享我的发现。

调试时,我输入了两个控制台日志到我的操作的简化版本,如下所示:

 case "x": if operandStack.count >= 2 {
    print(" display before popping is: \(display.text!) ")
    displayValue = operandStack.removeLast() * operandStack.removeLast()
    print(" display after popping is: \(display.text!) ")
    enter()
    }

弹出后显示为“newValue”。起初我不明白那是什么意思,但意识到我的问题是 setter。 newValue 是一个可选的,应该被展开,即“(newValue)!”

P.S。我选择 return:

return (display.text! as NSString).doubleValue

在我的 get.

此外,由于 newValue 是展开的,请记住,如果显示设置为 nil,它将崩溃。