Swift 中的简单 Date() 操作崩溃

Crash on simple Date() manipulations in Swift

我从 apple 收到越来越多的崩溃报告(全部在 iPhone 5,iOS 10.3.3),代码行如下:

    let date = NSDate()
    var dateComponents = DateComponents()
    dateComponents.hour = -6
    let calculatedDate = NSCalendar.current.date(byAdding: dateComponents, to: date as Date)

    let selectStatement = "SELECT nr from info where date > \(UInt((calculatedDate!.timeIntervalSince1970)) * 1000);"

崩溃报告指出最后一行是问题行。看来,calculatedDate 没有实例化。

之前的版本甚至第一行就崩溃了(iPhone 5, iOS 10.3.2)

我一个人无法在 iPhone 6s 上重现这些崩溃。

对这些陈述中可能出错的地方有什么建议吗?

使用 Date() 代替 NSDate() & Calendar 代替 NSCalendar。

let date = Date()
var dateComponents = DateComponents()
dateComponents.hour = -6
if let calculatedDate = Calendar.current.date(byAdding: dateComponents, to: date) {
   let selectStatement = "SELECT nr from info where date > \(UInt((calculatedDate.timeIntervalSince1970)) * 1000);"
}

问题是 iPhone 5 是一个 32 位设备,您遇到了整数溢出。将结果显式转换为 Int32.

时出现错误 here

如果您的 select 语句确实需要整数值,请使用 UInt64 而不是 UInt 来解决 32 位设备上的溢出问题。

与该问题无关,但是当您只能使用原生 Swift 类型(DateCalendar)时,不鼓励将基础类型与原生 Swift 类型混合使用。

明确显示问题的代码:

import Foundation

let date = Date()
var dateComponents = DateComponents()
dateComponents.hour = -6
let calculatedDate = Calendar.current.date(byAdding: dateComponents, to: date)
let selectStatement = "SELECT nr from info where date > \(UInt((calculatedDate!.timeIntervalSince1970)) * 1000);"
print(selectStatement) //prints 1504234558000
print(Int32(1504234558000))

ERROR at line 9, col 7: integer overflows when converted from 'Int' to 'Int32' print(Int32(1504234558000))