一尘不染

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

swift

我有以下代码:

var displayValue: Double{
    get{
        println("display.text =\(display.text!)")
        return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
    }
    set{
        display.text = "\(newValue)"
        userIsInTheMiddleOfTypingANumber = false;
    }
}

在模拟器中工作正常。但是当我在手机上尝试时,它崩溃了。这是控制台:

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

这行:

NSNumberFormatter()。numberFromString(display.text!)!

返回nil,这导致应用程序崩溃,导致无法打开可选包装。我真的不知道怎么了 我正在关注iTunes U中的一些教程。

任何帮助,将不胜感激。


阅读 262

收藏
2020-07-07

共1个答案

一尘不染

尝试:

get{
    println("display.text =\(display.text!)")
    let formatter = NSNumberFormatter()
    formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    return formatter.numberFromString(display.text!)!.doubleValue
}

因为NSNumberFormatter默认情况下使用设备区域设置,所以十进制分隔符可能不是"."。例如:

let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "ar-SA")
print(formatter.decimalSeparator!) // -> outputs "٫"
formatter.numberFromString("6.0") // -> nil

使用此类语言环境的格式化程序无法解析字符串,例如"6.0"。因此,如果您希望格式化程序获得一致的结果,则应明确指定locale

至于en_US_POSIX语言环境,请参阅文档

在大多数情况下,最佳选择en_US_POSIX的语言环境是,无论用户和系统偏好如何,该语言环境都是专门为产生美国英语结果而设计的。en_US_POSIX也是时间不变的(如果美国在将来的某个时候改变日期格式的方式,en_US将会改变以反映新的行为,但en_US_POSIX不会改变),以及平台之间en_US_POSIX的时间不变(在iPhone
OS上与在OS上相同)在OS X和其他平台上一样)。

2020-07-07