斯坦福计算器应用程序崩溃,错误“意外发现无”

时间:2015-11-30 22:43:42

标签: ios swift forced-unwrapping

我是编程的新手,我开始在iTunes U上使用stanford课程制作iPhone 8应用程序。当我在El Capitan使用Xcode 7和Swift 2时,他们正在使用Xcode 6和Swift 1.我发现Xcode能够接受的代码存在一些差异,并帮助我纠正(“println”是现在“打印”了),但我在代码的一个特定部分被绊倒了:

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

我已多次检查几次,以确保这正是老师写的。他正确构建并且正确运行,同时我的构建正确,但是当我尝试操作时显示这个致命的错误,“在展开可选值时意外地发现了nil”(所有细节见截图)。

Screenshot of the error

我一直在互联网上寻找一些相似的例子,包括一个在这个网站上的例子(Stanford Calculator app keeps crashing),但在尝试了所有建议之后,我得出的结论是我的系统中的某些东西必须是唯一的我在新的Xcode / Swift环境中运行,而不是遇到此问题的其他人。没有一个解决方案能够解决问题,并且所有解决方案都增加了自己的错误。

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

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

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

2 个答案:

答案 0 :(得分:1)

  

我已经多次仔细检查过几次,以确保这正是老师写的。他正确构建并正确运行,而我的构建正确,但在我尝试操作时显示这个致命的错误,"在解开一个Optional值时出乎意料地发现了n"

我怀疑exec是一个IBOutlet属性,需要连接到用户界面中的某些内容,可能是文本字段。如果它没有连接,那么即使您的代码完全相同,当您尝试使用其xcopy C:\Users\htpcn\AppData\Roaming\Kodi\userdata\addon_data\plugin.audio.pandoki\Pandoki\* E:\Music\Pandoki Tracks 属性时,您将获得display,并且解包会导致错误你正在看。

无论上述建议是否真正解决了您的问题,您真正需要做的是在崩溃发生点之前设置一两行断点并逐步执行代码。查看所涉及的变量并找出nil值的来源。你可以从那里开始向后工作,找出你期望不是text的东西,实际上是nil。学会以这种方式工作将帮助你解决这些问题(并且再次发生)。

答案 1 :(得分:1)

现在还不确定你是否找到了答案,但我今天早上遇到了类似的问题并且认为我分享了我找到的答案。

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

 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()
    }

弹出后显示为" ewValue"。我一开始无法弄清楚这意味着什么,但意识到我的问题是制定者。 newValue是一个可选的,应该被解包,即"(newValue)!"

P.S。我选择了回归:

return (display.text! as NSString).doubleValue

在我的get

此外,由于newValue已解包,请记住,如果将display设置为nil,它将崩溃。