我是编程的新手,我开始在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”(详见所有细节的截图) .
我一直在寻找互联网,并找到一些类似的例子,包括在这个网站上的一个(Stanford Calculator app keeps crashing),但在尝试了所有建议之后我得出结论,我的系统中的某些东西必须是唯一的,或者我在一个新的Xcode中运行/ Swift环境比其他人有这个问题 . 没有一个解决方案能够解决问题,并且所有解决方案都增加了自己的错误 .
在回答别人的问题时,有人建议我们使用此代码来确保如果“显示”返回“nil”,它将提供“0”代替:
return (NSNumberFormatter().numberFromString(display.text) as? Double) ?? 0
我尝试了这个,但它只给了我更多的错误,有些似乎与Swift 2有关(它需要一个逗号后双,想要我打开display.text,并抱怨有一个预期的表达式丢失 - 也许建议的代码在Swift 1中是好的??) .
2 回答
我怀疑
display
是一个IBOutlet属性,需要连接到用户界面中的某些东西,可能是文本字段 . 当你尝试使用它的text
属性时,如果它's not connected, then even though your code is exactly the same, you'将获得nil
,并且解包将导致您看到的错误 .无论上述建议是否真正解决了您的问题,您真正需要做的是在崩溃发生点之前设置一两行断点并逐步执行代码 . 查看所涉及的变量并找出
nil
值的来源 . 你可以从那里向后工作,找出为什么你期望不是nil
的东西实际上是nil
. 学习以这种方式工作将有助于您在发生这些问题时解决这些问题(并且它们将再次发生) .不知道你现在是否找到了答案,但我今天早上遇到了类似的问题,并认为我会分享我发现的内容 .
在调试时,我输入了两个控制台日志到我的操作的简化版本,如下所示:
弹出后显示为“ewValue” . 我一开始无法弄清楚这意味着什么,但意识到我的问题是制定者 . newValue是一个可选的,应该解包,即“(newValue)!”
附:我选择了回归:
return (display.text! as NSString).doubleValue
在我的
get
.此外,由于newValue已解包,请记住,如果将display设置为nil,它将崩溃 .