2015-02-07 191 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

相關問題