0

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

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

我已经仔细检查了几次,以确保这正是老师写的。他的构建正确且功能正确,而我的构建正确,但是当我尝试操作它时显示此致命错误,“在展开可选值时意外发现 nil”(所有详细信息请参见屏幕截图)。

错误截图

我一直在互联网上寻找一些类似的例子,包括这个网站上的一个(斯坦福计算器应用程序不断崩溃),但在尝试了所有建议后,我得出结论,我的系统中必须有一些东西是独一无二的,否则我正在操作在一个新的 Xcode/Swift 环境中,而不是其他有这个问题的环境。没有一个解决方案可以解决问题,而且它们都添加了自己的错误。

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

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

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

4

2 回答 2

1

我已经仔细检查了几次,以确保这正是老师写的。他的构建正确且功能正确,而我的构建正确,但是当我尝试操作它时显示此致命错误,“在展开可选值时意外发现 nil”

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

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

于 2015-11-30T22:49:12.103 回答
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()
    }

弹出后显示为“newValue”。起初我无法弄清楚这意味着什么,但意识到我的问题是二传手。newValue 是一个可选的,应该被解包,即“(newValue)!”

PS我选择退货:

return (display.text! as NSString).doubleValue

在我的get.

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

于 2016-09-10T17:19:20.447 回答