Swift: 这个数学函数有什么问题?

Swift: What's wrong with this math function?

我正在尝试使用此 Unixtime 值创建一个变量,但出现 EXC_BAD_INSTRUCTION 错误。我真的不知道为什么!

func Unixtime()->Int {
    return Int(NSDate().timeIntervalSince1970)
}
print((Unixtime()+2)*2)

它可以在 Playground 上运行,但是 运行 如果我将它放在任何项目中都无法运行! 怎么了?

是因为整数溢出

结果值接近 2926042746,其中 Int32.max2147483647。所以如果你在 32 位应用程序中 运行 这个,它会溢出并导致 EXC_BAD_INSTRUCTION.

解决方案是使用 UInt64Double


这是可靠地重现此错误的代码

func Unixtime()->Int32 {
    return (NSDate().timeIntervalSince1970)
}
print((Unixtime()+2)*2)

Int的大小在32位平台上是32位的(例如iPhone5及以下),但现在的时间戳在0x57300000范围内,这将乘以2肯定会溢出。在Swift算术溢出会导致程序崩溃。

如果您不需要输出为整数,您可以强制输出为 Int64,或者只是 return a TimeInterval (a Double)。

// swift 3
func Unixtime() -> TimeInterval {
    return Date().timeIntervalSince1970
}

// swift 2
func Unixtime() -> NSTimeInterval {
    return NSDate().timeIntervalSince1970
}

print((Unixtime() + 2) * 2)