如何将 DateComponents 类型的对象保存到 CloudKit 字段?

How would I save an object of type DateComponents to a CloudKit field?

我正在为 iOS 应用程序使用 Swift。

我需要将 DateComponents 对象存储为 CloudKit 中的字段。

我该怎么做?

到目前为止,我认为我需要将 CloudKit 字段设置为类型字节,并将 DateComponents 对象转换为数据对象。查看数据 class 的文档,我不知道如何初始化数据对象。我不知道如何使用其中一个初始化程序中使用的 UnsafeBufferPointer。

以下代码给出运行时错误:

newRecord.setObject((dateComponents as! __CKRecordObjCValue), forKey: DatabaseNameStrings.fieldTime)

这是调试中的运行时错误消息 window:

Could not cast value of type 'NSDateComponents' (0x1d04208c8) to '__C.CKRecordValue' (0x1d0420ab0).

我还需要将数据转换为 DateComponents。 Data和DateComponents classes都符合Codable协议,它继承了Decoder协议。 DateComponents 的初始化器之一是:

init(from: Decoder)

这让我怀疑在我从字节类型的 CloudKit 字段中获取数据对象后,有一种方法可以使用该 init 将类型数据转换为 DateComponents。

以下代码:

if let data = privateRecord.object(forKey: DatabaseNameStrings.fieldTime) as? Data {

    let dateComponents = DateComponents(from: data) // error here

}

在 Xcode 编辑器中生成一个错误:

Argument type 'Data' does not conform to expected type 'Decoder'

我认为既然 Data 和 DateComponents 都符合 Decoder 协议,那么代码就可以工作了。

看来你可能有点over-engineering了。以下是您可以考虑的几个备选方案:

  • 将日期存储在 CloudKit 和 re-parse 上的日期字段中,以便为应用中的组件添加日期。
  • 将每个日期组成部分(年、月、日等)存储为 CloudKit 上的单独整数字段(或者如果要 pre-format 则存储为字符串)。

只是一个想法。祝你好运。 :)