2015-02-07 177 views
3

罚款我有以下代码:的iOS应用程序崩溃的电话,但工作在模拟器

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 

这条线:(!display.text)

NSNumberFormatter()numberFromString!

返回nil,导致应用程序崩溃导致它无法打开可选。我真的不知道什么是错的。我正在iTunes U中使用一些教程。

任何帮助,将不胜感激。

+0

也许是因为display.text等于零。这就是为什么它变得困惑。 – 2015-02-07 13:14:24

+0

@AshrafTawfeeq它不返回零我打印,它的值是6.0 – 2015-02-07 13:17:08

回答

7

尝试:

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现场,看到the document

在大多数情况下,最好的区域选择是en_US_POSIX,这是专门用来产生美国英语的结果,无论用户和系统首选项的语言环境。 en_US_POSIX也是不变的(如果美国在未来的某个时间点改变格式日期的方式,en_US将改变以反映新的行为,但en_US_POSIX不会),并且平台之间(en_US_POSIX在iPhone上的工作原理相同OS,就像它在OS X上做的一样,就像它在其他平台上一样)。

+0

这正是问题所在。无论如何是否有更好的解决方案?喜欢一劳永逸地设置语言环境? – 2015-02-07 20:19:13

+0

也许,你可能想要创建一个singleton类,或者是保存缓存格式化程序的全局常量。但是,你应该知道'NSNumberFormatter'不是线程安全的。 – rintaro 2015-02-09 05:11:42

+0

哇,谢谢。多么微妙的错误......只发生在别人的设备上,无法复制等等。 – elsurudo 2016-08-17 15:01:27

相关问题