我正在使用 CloudKit 和 Swift for iOS。
我正在将类型为日期组件的对象保存在字节类型的 CloudKit 字段中。当我检索对象时,它与我最初保存的对象的值不同。
以下是我将对象保存到 CloudKit 的代码:
let unsafePointer: UnsafePointer<DateComponents> = UnsafePointer<DateComponents>(&time)
let unsafeBufferPointer: UnsafeBufferPointer<DateComponents> = UnsafeBufferPointer<DateComponents>(start: unsafePointer, count: 1)
let data: Data = Data(buffer: unsafeBufferPointer)
privateRecord.setObject(data as CKRecordValue?, forKey: DatabaseNameStrings.fieldTime)
以下是调试窗口中的打印结果:
时间 = 日历:公历(自动更新当前( 时区:美国/芝加哥(自动更新当前( 小时:12 分钟:0 是闰月:假
这是我从CloudKit检索对象的代码:
if let dataTime = privateRecord.object(forKey: DatabaseNameStrings.fieldTime) as? Data {
let unsafeMutableBufferPointer: UnsafeMutableBufferPointer<DateComponents> = UnsafeMutableBufferPointer<DateComponents>.allocate(capacity: 1)
_ = dataTime.copyBytes(to: unsafeMutableBufferPointer)
print("unsafeMutableBufferPointer.first =", unsafeMutableBufferPointer.first as Any)
privateTime = unsafeMutableBufferPointer.first
}
以下是调试窗口中的打印结果:
unsafeMutableBufferPointer.first = 可选(era
: 0 年: 0 个月: 0 天: 0 小时: 0 分钟: 0 秒: 0 纳秒: 0 工作日: 0 工作日序数: 0 季度: 0 周的月份: 0 周的一年: 0 年为周的一年: 0 是闰月: 假(
尝试保留DateComponents
实例是错误的方法;您无法看到对象的内部结构,并且此结构可能会随着 Swift 或 iOS 更新而更改。
您的假设是,只需恢复表示其他实例的字节即可绕过DateComponents
的初始化;这是一个不正确的假设。
DateComponents
实际上是免费桥接到NSDateComponents
的基础实例的。
调用UnsafeBufferPointer<DateComponents>(start: unsafePointer, count: 1)
时,您正在访问用于访问底层NSDateComponents
实例的 Swift 结构。
当您随后尝试重新创建此结构时,该基础对象不存在,并且您得到 0。
您应该保存重新创建日期组件所需的特定字段(例如时区、小时等(或保存Date
对象。