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种不同的情绪,这就是我选择枚举的原因.
Transformable
CoreData中有一种类型,专门用于处理本机不支持的类型.
基本上,此类型将帮助您在将非受支持类型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
财产.
无需改变 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)
归档时间: |
|
查看次数: |
2475 次 |
最近记录: |