2017-02-09 61 views
1

下面的代碼:對爲什麼此代碼在iPhone 5上崩潰?

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

崩潰[32位] iPhone 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 
} 

更新: 我向蘋果發送了錯誤報告。

+0

如果您知道'Int64'在32位設備上可用,爲什麼不顯示'TextProcessor.textDidChange()'的代碼。我可以向你保證你的'getCurrentMillis()'在32位設備中工作正常。問題在於來電方。 – OOPer

+0

'Int64' *在32位系統上可用。問題一定在其他地方。 –

+0

你確定崩潰是在getCurrentMillis函數中嗎?我無法從棧回溯中看到它。 –

回答

3

我不知道發生了什麼事在斯威夫特的編譯器,但是當你寫:

if getCurrentMillis() - timeOfLastInput > 150 { 

斯威夫特使用這一個在許多重載減法運算符:

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

(用Xcode 8.2.1測試)

不幸的是, Int64.StrideInt,所以當在32位系統中timeOfLastInput0時,操作結果溢出。

要解決雨燕的這種行爲,您可以更改行:

if getCurrentMillis() > timeOfLastInput + 150 { 

不管怎樣,你最好派bug report to Appleto swift.org

+1

好抓!在這裏觀察到類似的問題:http://stackoverflow.com/questions/27496415/swift-type-conversions。 –

+1

我假設'if getCurrentMillis() - timeOfLastInput> Int64(150)'也可以。 - 但無論如何,這種行爲並不直觀,並違背了Swift聲稱的「安全性」。 –

+0

我很好奇,在哪裏說'Int64.Stride'是'Int'? –

-2

正如你已經知道你的iphone 5在32位系統上運行。你想在64位上使用Int編碼。實際上,它無法匹配。你的iphone不能存儲它。

擴展the_dahiya_boy的解決方案:Int大小與32位系統上的Int32相同,與64位系統上的Int64大小相同。

Reference