将 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
属性。如您所知,您必须自己处理 Date
与 NSDate
。
如果你不让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
,它就可以正常工作。
我的数据库模型中有很多日期字段。 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
属性。如您所知,您必须自己处理 Date
与 NSDate
。
如果你不让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
,它就可以正常工作。