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

时间:2019-07-05 01:40:31

标签: field nsdata cloudkit nsdatecomponents ckrecord

我正在将Swift用于iOS应用。

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

我该怎么做?

到目前为止,我认为我需要将CloudKit字段设置为Bytes,然后将DateComponents对象转换为Data对象。查看Data类的文档,我不知道如何初始化Data对象。我不知道如何使用初始化程序之一中使用的UnsafeBufferPointer。

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

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

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

  

无法将类型'NSDateComponents'(0x1d04208c8)的值强制转换为'__C.CKRecordValue'(0x1d0420ab0)。

我还需要将数据转换为DateComponents。 Data和DateComponents类均符合Codable协议,该协议继承了Decoder协议。 DateComponents的初始化程序之一是:

init(from: Decoder)

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

以下代码:

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

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

}

在Xcode编辑器中生成一个错误,内容为:

  

参数类型“数据”与预期的类型“解码器”不符

我认为,由于Data和DateComponents均符合Decoder协议,因此代码可以正常工作。

1 个答案:

答案 0 :(得分:1)

似乎您可能对此进行了过度设计。您可以考虑以下几种选择:

  • 将日期存储在CloudKit的日期字段中,然后重新解析您应用中的日期组件。
  • 将每个日期成分(年,月,日等)存储为CloudKit上单独的整数字段(如果要对其进行预格式化,则存储为字符串)。

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