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

时间:2017-02-24 11:06:59

标签: ios swift core-data swift3

晚上,

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

T是我创建的枚举。

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

我目前的设置是:

attribute x, type: Undefined, CustomClass: T.

但我有错误:

  

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

特定目的:

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

2 个答案:

答案 0 :(得分:5)

CoreData中有一种名为Transformable的类型,专门用于处理本机不支持的类型。

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

答案 1 :(得分:1)

无需弯曲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!)