Использовать Swift Date с помощью CoreData

У меня есть много полей даты в моей модели базы данных. CoreData позволяет использовать NSDate или TimeInterval для сохранения дат в зависимости от опции "Использовать тип скаляра".

введите описание изображения здесь

Однако оба эти параметра плохие для меня, поскольку я хочу использовать даты как Date. Поскольку NSDate не неявно конвертируется в Date, мне нужно преобразовать значения в Date или реализовать множество настраиваемых наборов/геттеров в моих классах NSManagedObject.

Я попытался использовать ValueTransformer, но он не работает с классами не @objc, такими как Date.

Итак, есть простой способ сохранить и получить значения Date в/из CoreData?

Ответ 1

Да, но вам это может не понравиться. Если вы объявите свойство с использованием типа "Дата" Core Data и, пусть Xcode сгенерирует подкласс NSManagedObject для вас, свойство будет иметь свойство @NSManaged типа NSDate. Как вы поняли, вам придется иметь дело с Date vs. NSDate самостоятельно.

Если вы не, пусть Xcode создает подкласс для вас (в Xcode 8 установите "Codegen" на "Manual/None" ), вы можете объявить свойство "date" основной информации как нечто как

@NSManaged public var timestamp: Date?

Это просто сработает. Вы можете читать и писать значения Date, а Core Data будет делать все правильно. Но вы полностью несете ответственность за код в подклассе NSManagedObject. Вам нужно будет создать весь класс. Если вы обновите модель Core Data, вам также придется обновить класс. Является ли это целесообразным, зависит от вас, но это единственное решение, которое, кажется, существует прямо сейчас.

Обновление. В Xcode 9 сгенерированный код использует Date, поэтому это больше не нужно.

Ответ 2

Существует обходное решение, которое работает, если вы установите его как трансформируемое и установите его собственный класс в Date, он просто работает.

Трансформируемая дата