致命的错误:意外地发现零,而解包可选值 – 斯坦福计算器

我正在观看ItunesU上的Standford Swift讲师,并且在理解上有些麻烦。

讲师在一个点上将string转换为Double。 他做了如下:

return NSNumberFormatter().numberFromString(display.text!)!.doubleValue 

display.text是一个UILabel无论如何,当我这样做我的应用程序崩溃,我得到以下错误:

 fatal error: unexpectedly found nil while unwrapping an Optional value 

当我像这样types化string时:

 (display.text! as NSString).doubleValue 

它工作正常。

我知道在任何地方都必须有一个可选的variables,但是我不是那么认为在这一点上出了什么问题。 我很高兴每一个提示。

问题是你的display.text文本中没有一个有效的数字。 所以它会返回零。

所以你的表情会变成:

 return nil!.doubleValue 

它肯定会崩溃。

对于将String转换为double你的第二种方法更合适。 手段使用:

 (display.text! as NSString).doubleValue 

对于这种情况是一个更好的方法。


参考: NSNumberFormatter类参考

- numberFromString:

返回通过parsing给定string创build的NSNumber对象。

宣言

迅速

func numberFromString(_ string: String) -> NSNumber?

Objective-C的

- (NSNumber *)numberFromString:(NSString *)string

参数

一个NSString对象,被parsing以生成返回的数字对象。

返回值

通过使用接收者格式parsingstring创build的NSNumber对象。 如果传递的string中没有数字,则返回nil。

讨论

string中的任何前导空格都将被忽略。 例如,string“5”和“5”以相同的方式处理。

米卡,我只是想出了为什么我的计算器程序崩溃与你一样的错误信息。 请记住,当我们创build回车键时,它仍然“绑定”到appendDigit函数,我们必须select/右键单击button来断开连接。 我和你同样的问题,事实certificate,我有复制/粘贴我的操作键,他们都仍然连接到appendDigit函数。 这意味着每次我点击“X”键时,它都会向appendDigit函数发送一个非数字,这个函数在展开时等价于“nil”。 希望有所帮助。 威尔顿

在第一种forms中,如果display.text不包含数字,则numberFromString返回nil

我的猜测是,在第一种情况下,你的display.text不是用数字初始化的。 所以numberFromString返回一个你试图解开使用的nil ! 。 这抛出了错误。

在第二种forms中,不pipe是什么内容(空,“1.0”,“foo”…),都是NSStringtypes的NSString ,然后调用doubleValue ,如果string不是以有效文本开头,则返回0.0不同于数字)。这不会抛出错误,在最坏的情况下它将返回0.0。

我目前正在听讲座,遇到同样的问题。 user3763062和我有同样的问题:我们都不小心把enter键关在appendDigit函数中。

删除连接解决了我的问题。

那么,我猜你学习了Swift编程并制作了第一个计算器。 如果我是正确的,你得到这个崩溃,因为你忘了删除一个消息,你的inputbutton发送。 在这种情况下,您会收到错误,因为“input”符号不代表数字。

当我在iPhone上testing应用程序时,我遇到了同样的问题。 问题是小数点的问题。 我的iPhone区域被设置为罗马尼亚,在那里我们使用逗号来分隔小数,我相信numberFromString取决于转换时的地区。 在我将地区更改为美国之后,没有出现零例外。

你可以使用一个条件转换来Double和nil合并运算符来确保它不返回nil,如下所示:

 var myNumber = NSNumberFormatter().numberFromString("10.5") as? Double ?? 0 println(myNumber) // 10.5 myNumber = NSNumberFormatter().numberFromString("10") as? Double ?? 0 println(myNumber) // 10.0 myNumber = NSNumberFormatter().numberFromString("abc") as? Double ?? 0 println(myNumber) // 0.0 

对我来说,这个工作:

 return Double(display.text!)!