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 类型(Date
和 Calendar
)时,不鼓励将基础类型与原生 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))
我从 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
.
如果您的 select 语句确实需要整数值,请使用 UInt64
而不是 UInt
来解决 32 位设备上的溢出问题。
与该问题无关,但是当您只能使用原生 Swift 类型(Date
和 Calendar
)时,不鼓励将基础类型与原生 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))