2015-02-07 4 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가 nil과 같기 때문일 수 있습니다. 그것이 혼란스러워지는 이유입니다. –

+0

@AshrafTawfeeq 인쇄되지 않고 반환되는 값은 6. –

답변

7

보십시오 NSNumberFormatter 기본적으로 장치의 로케일을 사용

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

왜냐하면 그것이 소수 세퍼레이터 "."가 아니라고 할 수있다. "6.0" 같은 문자열을 파싱 할 수없는 등의 로케일을 사용

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

포맷터 예 :. 따라서 포맷터에서 일관된 결과를 얻으려면 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

입니다. 정확하게 문제였습니다. 어쨌든 더 나은 해결책이 있습니까? 한 번 로케일을 설정하고 싶습니다. –

+0

캐시 된 포맷터를 보유하는 싱글 톤 클래스 또는 글로벌 상수를 만들 수도 있습니다. 하지만 NSNumberFormatter는 쓰레드에 안전하지 않다는 것을 알아 두어야한다. – rintaro

+0

와우, 고마워. 미묘한 버그는 ... 다른 사람의 기기에서만 발생했거나 재생산 할 수 없었습니다. – elsurudo