Используйте дату Swift с CoreData

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

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

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

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

2 ответа

Решение

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

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

@NSManaged public var timestamp: Date?

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

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

Здесь есть обходной путь, который работает, если вы установите его как трансформируемый и установите его пользовательский класс в Date это просто работает.

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

Другие вопросы по тегам