我正在斯坦福大学使用Swift在线学习斯坦福iPad和iPhone开发人员课程,并致力于创建一个计算器应用程序。 (编程还是有点新鲜。)
但是,每当我从计算器中选择一个运算符时,它都会随着错误信息而崩溃。
operandStack = [36.0]
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)
然后当我查看ViewController以查看突出显示源代码的哪一部分时。就是这样:
NSNumberFormatter().numberFromString(display.text!)!.doubleValue }
下面的错误消息,但是:
THREAD 1:EXC_BAD_INSTRUCTION(code:EXC_1386_INVOP,subcode=0x0)
我不明白发生了什么,因为我从讲座中逐字逐句地输入了代码。
感谢任何帮助!
提前致谢!
答案 0 :(得分:2)
我也被困在课程的这一部分!
我认为苹果最近对NSNumberFormatter的numberFromString方法进行了修改。因为当我打印出display.text!时,没有任何错误。换句话说,在打开那部分时没有找到零。
我们要解开的另一部分就在这里,第二部分!马克,我们只拆开这部分:
NSNumberFormatter().numberFromString(display.text!)
但是我们有一个错误,所以numberFromString应该返回nil。
但在视频中,它并没有。它完美地将浮点数字符串(例如" 36.0")转换为NSNumber,然后转换为Double。
自从你的问题在5月20日被问到,我找不到任何" old"问题,我认为Apple已经改变了numberFromString上的代码。
编辑:我做了一些疯狂的事情并使用了Find&替换(命令+ F)将所有" Double" s替换为我的代码中的" Int" s。乘法部分现在运作良好,我认为问题是关于"。"关于双打的一部分。
编辑2:我解决了。美国等一些国家使用"。"分隔小数和其他一些如土耳其使用","去做吧。它适用于视频,因为他在美国这样做。
NSNumberFormatter有一个名为decimalSeparator的属性。我们必须将其设置为"。"。我做了以下更改为我的代码,它工作得很完美。
var displayValue: Double {
get {
var formatter = NSNumberFormatter()
formatter.decimalSeparator = "."
return (formatter.numberFromString(display.text!)!.doubleValue)
}
set {
display.text = "\(newValue)"
userIsInTheMiddleOfTypingNumber = false
}
}
答案 1 :(得分:0)
“在展开可选项时找到nil”意味着当您使用运算符时,您有一个可能或可能没有值的变量!你说的很快“相信我,那里有一个价值”但是如果没有swift会抛出你刚看到的异常。
避免这种情况的最佳方法是在使用前进行检查:
if let value = display.text{
//if your code get here value is safe to use
NSNumberFormatter().numberFromString(value).doubleValue
}