2017-02-09 1 views
1

다음 코드 :에iPhone 5에서이 코드가 왜 충돌하나요?

func getCurrentMillis() -> Int64 { 
    return Int64(Date().timeIntervalSince1970 * 1000) 
} 

충돌 [32 비트] 메시지와 함께 아이폰 5 :

EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe) 

나는 이유를 이해하지 않는이 계산의 결과가 Int64에 맞게, 또는 생각 해봐야 할 것 같습니다 나는 무엇인가 놓친다?

스택 트레이스이 (TextProcessor.textDidChange() 전화를 getCurrentMillis())을 보여줍니다

enter image description here

당 OOPer의 요청, 나는 TextProcessor 관련 코드를 추가합니다

var timeOfLastInput: Int64 = 0 

... 

if getCurrentMillis() - timeOfLastInput > 150 { 
    textMap.cursorPosition = nil 
} 

업데이트 : 나 '를 버그 보고서를 Apple에 보냈습니다.

+0

32 비트 디바이스에서'Int64'를 사용할 수 있다면'TextProcessor.textDidChange()'의 코드를 보여 주면 어떨까요? 나는 당신의'getCurrentMillis()'가 32 비트 디바이스에서 잘 작동한다는 것을 확신 할 수있다. 문제는 발신자쪽에 있습니다. – OOPer

+0

'Int64' *는 32 비트 시스템에서 사용할 수 있습니다. 문제는 다른 곳에서 발생해야합니다. –

+0

크래시가 getCurrentMillis 함수에 있는지 확인 하시겠습니까? 나는 스택 백 트레이스에서 그것을 볼 수 없다. –

답변

3

나는 스위프트 컴파일러에서 무슨 일이 일어나고 있는지 모르겠지만, 당신이 쓸 때 :

public func -<T : Strideable>(lhs: T, rhs: T) -> T.Stride 
:

if getCurrentMillis() - timeOfLastInput > 150 { 

스위프트는 많은 오버로드 된 빼기 연산자에서이 하나를 사용하는

(Xcode 8.2.1로 테스트 됨)

불행히도, Int64.StrideInt이므로 32 비트 시스템에서 timeOfLastInput0 일 때 연산 결과가 오버플로됩니다. 당신이 더 bug report to Apple 또는 to swift.org을 보낼 것, 어쨌든

if getCurrentMillis() > timeOfLastInput + 150 { 

:

는 스위프트의이 문제를 해결하려면, 당신은 라인을 변경할 수 있습니다.

+1

잘 잡으세요! 비슷한 문제가 http://stackoverflow.com/questions/27496415/swift-type-conversions에서 발견되었습니다. –

+1

나는'getCurrentMillis() - timeOfLastInput> Int64 (150)'도 작동한다고 가정합니다. 그러나 어쨌든,이 행동은 직관적이지 않고 스위프트의 "안전"에 반대합니다. –

+0

'Int64.Stride'가'Int '라고 말한 곳이 궁금합니다. –

-2

당신의 아이폰 5가 32 비트 시스템에서 작동한다는 것은 이미 알고 있습니다. 64 비트로 코딩 된 Int를 사용하고자합니다. 사실, 그것은 일치 할 수 없습니다. 귀하의 아이폰은 그것을 저장할 수 없습니다.

the_dahiya_boy의 솔루션을 확장하려면 : Int 크기는 32 비트 시스템에서 Int32와 같으며 64 비트 시스템에서 Int64와 같은 크기입니다.

Reference

관련 문제