我有以下代码:
var displayValue: Double{
get{
println("display.text =\(display.text!)")
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
}
set{
display.text = "\(newValue)"
userIsInTheMiddleOfTypingANumber = false;
}
}
Run Code Online (Sandbox Code Playgroud)
它在模拟器中工作正常.但是当我在手机上试用它时会崩溃.这是控制台:
digit= 3
display.text =3
operandStack =[3.0]
digit= 2
display.text =2
operandStack =[3.0, 2.0]
display.text =6.0
fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)
这一行:
NSNumberFormatter().numberFromString(display.text!)!
返回nil导致应用程序崩溃导致它无法打开可选项.我真的不知道出了什么问题.我正在关注iTunes U中的一些教程.
任何帮助,将不胜感激.
尝试:
get{
println("display.text =\(display.text!)")
let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
return formatter.numberFromString(display.text!)!.doubleValue
}
Run Code Online (Sandbox Code Playgroud)
因为,NSNumberFormatter默认情况下使用设备区域设置,小数分隔符可能不是".".例如:
let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "ar-SA")
print(formatter.decimalSeparator!) // -> outputs "?"
formatter.numberFromString("6.0") // -> nil
Run Code Online (Sandbox Code Playgroud)
使用这种语言环境的格式化程序无法解析字符串"6.0".因此,如果您希望格式化程序获得一致的结果,则应明确指定locale.
至于en_US_POSIX语言环境,请参阅文档:
在大多数情况下,最佳选择
en_US_POSIX的语言环境是一个专门设计用于产生美国英语结果的语言环境,无论用户和系统偏好如何.en_US_POSIX在时间上也是不变的(如果美国,在未来的某个时刻,它en_US会改变格式化日期的方式,将改变以反映新行为,但en_US_POSIX不会改变),以及平台之间(en_US_POSIX在iPhone OS上的工作原理与它相同)在OS X上,和在其他平台上一样).