将 Swift 的日期与 CoreData 一起使用

Use Swift's Date with CoreData

我的数据库模型中有很多日期字段。 CoreData 允许根据 "Use Scalar Type" 选项使用 NSDate 或 TimeInterval 来保存日期。

但是这两个选项对我来说都不好,因为我想将日期用作 Date 对象。由于 NSDate 不能隐式转换为 Date 我必须将 cast/convert 值转换为 Date 或在我的 NSManagedObject 类.[= 中实现很多自定义 setters/getters 18=]

我曾尝试使用 ValueTransformer,但它不适用于非@objc 类,例如 Date

那么有没有一种简单的方法来保存和获取 Date 值 to/from CoreData?

是的,但您可能不喜欢。如果您使用核心数据 "Date" 类型 声明 属性 让 Xcode 生成 NSManagedObject subclass你,属性 将是类型 NSDate@NSManaged 属性。如您所知,您必须自己处理 DateNSDate

如果你让Xcode为你生成子class(在Xcode 8设置"Codegen" "Manual/None"),你可以将核心数据 "date" 属性 声明为

@NSManaged public var timestamp: Date?

它会起作用的。你可以读写 Date 个值,Core Data 会做正确的事情。但是你对 NSManagedObject subclass 中的代码负全部责任。您必须创建整个 class。如果更新 Core Data 模型,则还必须更新 class。这是否值得取决于您,但这是目前似乎存在的唯一解决方案。

更新:在Xcode 9 中,生成的代码使用了Date,所以这不再是必要的了。

这里有一个可行的解决方法,如果您将其设置为可变形并将其自定义 class 设置为 Date,它就可以正常工作。