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

And*_*tto 4 core-data ios swift swift3

晚间,

我正在尝试使用类型为T的属性x构建实体A.

T是我创建的枚举.


我应该如何设置xcdatamodel以使用属性的自定义类型?

我目前的设置是:

attribute x, type: Undefined, CustomClass: T.
Run Code Online (Sandbox Code Playgroud)

但我有错误:

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

特殊目的:

x是一种"情绪"属性,可能有3种不同的情绪,这就是我选择枚举的原因.

dea*_*eef 5

TransformableCoreData中有一种类型,专门用于处理本机不支持的类型.

基本上,此类型将帮助您在将非受支持类型Data存储到数据库之前自动将其序列化为对象,并在检索对象时对其进行反序列化.这非常适合存储,但在查询时实现起来会很棘手(因为您的查询现在使用的Data是数据库使用的原始数据).


实现此目的的更简单方法是使用隐藏原始值的计算属性(通常为a String或a Int).

以下是如何实现它:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,当您在查询中添加约束时,您需要使用rawMood并传递它String.核心数据不了解mood财产.


Mun*_*ndi 4

无需改变 Core Data 托管对象来接受枚举,尤其是在这种简单的情况下。

只需使用标准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!)
Run Code Online (Sandbox Code Playgroud)