iOS App在手机上崩溃但在模拟器上运行正常

Oma*_*ary 3 xcode ios swift

我有以下代码:

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中的一些教程.

任何帮助,将不胜感激.

rin*_*aro 8

尝试:

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上,和在其他平台上一样).