核心数据和自定义属性类型



晚上,

我正在尝试使用类型t的属性x构建实体a

t是我创建的枚举。


我应该如何将XCDATAMODEL设置为使用自定义类型作为属性?

我的当前设置是:

attribute x, type: Undefined, CustomClass: T.

,但我有错误:

x ....核心数据必须具有定义的类型。

特定目的:

x是一种"情绪"属性,具有3种不同的情绪,这就是为什么我选择枚举。

Coredata中有一种称为Transformable的类型,专门用于处理不本地支持的类型。

基本上,这种类型将帮助您在将其存储在数据库中之前自动将非支持类型序列化为Data对象,并在检索到它时对其进行序列化。这非常适合存储,但是在查询时实现可能会变得棘手(因为您的查询现在使用数据库使用的RAW Data)。


实现此目的的一种更简单的方法是使用隐藏原始值的计算属性(通常是StringInt)。

这是您可以实现它的方法:

enum Mood: String
{
    case happy
    case sad
}
class MyObject: NSManagedObject
{
    @NSManaged private var rawMood: String?
    var mood: Mood? {
        get {
            if let rawMood = self.rawMood {
                return Mood(rawValue: rawMood)
            } else {
                return nil
            }
        }
        set {
            self.rawMood = newValue?.rawValue
        }
    }
}

请记住,当您在查询上添加相反时,您需要使用rawMood并将其传递给String。核心数据不知道mood属性。

无需弯曲核心数据管理的对象即可接受枚举,尤其是在这种简单的情况下。

只需使用标准的String属性,将其称为mood,然后在阅读和写入时进行枚举评估和适当的逻辑。这将导致人类可读,直观的代码。

编辑:示例实现

enum Mood: String { case happy, ok, sad }
class Person: NSManagedObject {
    var mood: String?
}
// set
person.mood = Mood.happy.rawValue
// get
let aPersonsMood = Mood(rawValue: person.mood!)

最新更新