Как мне сохранить объект типа DateComponents в поле CloudKit?

Я использую 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)

что заставляет меня подозревать, что есть способ использовать этот init для преобразования типа Data в DateComponents после того, как я получу объект Data из поля CloudKit типа Bytes.

Следующий код:

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

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

}

генерирует ошибку в редакторе Xcode, которая говорит:

Тип аргумента "Данные" не соответствует ожидаемому типу "Декодер"

Я думал, что, поскольку и Data, и DateComponents соответствуют протоколу Decoder, этот код будет работать.


person Daniel Brower    schedule 05.07.2019    source источник


Ответы (1)


Кажется, вы можете немного перестроить это. Вот пара альтернатив, которые вы могли бы рассмотреть:

  • Сохраните дату в поле даты в CloudKit и повторно проанализируйте компоненты даты в своем приложении.
  • Сохраните каждый компонент даты (год, месяц, день и т. Д.) В виде отдельных целочисленных полей в CloudKit (или в виде строк, если вы хотите их предварительно отформатировать).

Просто мысль. Удачи. :)

person Clifton Labrum    schedule 05.07.2019