以下代码:
func getCurrentMillis() -> Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
在[32位] iPhone 5上崩溃并显示消息:
EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe)
我不明白为什么这个计算结果似乎适合Int64
,或者我错过了什么?
Stacktrace会显示此信息(TextProcessor.textDidChange()
来电getCurrentMillis()
):
根据OOPer的请求,我添加了TextProcessor的相关代码:
var timeOfLastInput: Int64 = 0
...
if getCurrentMillis() - timeOfLastInput > 150 {
textMap.cursorPosition = nil
}
更新 我已经向Apple发送了错误报告。
答案 0 :(得分:3)
我不确定Swift编译器中发生了什么,但是当你写:
if getCurrentMillis() - timeOfLastInput > 150 {
Swift在许多重载的减法运算符中使用了这个:
public func -<T : Strideable>(lhs: T, rhs: T) -> T.Stride
(使用Xcode 8.2.1测试。)
不幸的是,Int64.Stride
为Int
,因此当32位系统中timeOfLastInput
为0
时,操作结果会溢出。
要解决Swift的这种行为,您可以将行更改为:
if getCurrentMillis() > timeOfLastInput + 150 {
无论如何,您最好发送bug report to Apple或to swift.org。
答案 1 :(得分:-2)
如您所知,您的iphone 5在32位系统上运行。您想使用64位的Int编码。实际上,它无法比拟。你的iphone无法存储它。
扩展the_dahiya_boy的解决方案:在32位系统上,Int大小与Int32相同,并且与64位系统上的Int64大小相同。