致命的错误:意外地发现零,而解包可选值 – 斯坦福计算器
我正在观看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”…),都是NSString
types的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!)!