0

在以下代码行中,我从苹果(全部在 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 上重现这些崩溃。

有什么建议可以在这些陈述中出错吗?

4

2 回答 2

2

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

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

与问题无关,但是当您可以只使用原生 Swift 类型(DateCalendar)时,不鼓励将 Foundation 类型与原生 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))

第 9 行第 7 列的错误:从“Int”转换为“Int32”时整数溢出 print(Int32(1504234558000))

于 2017-09-01T08:57:41.940 回答
0

使用 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);"
}
于 2017-09-01T08:54:15.973 回答