Я использую 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, код будет работать.