是否可以将Enum用作我的模型的属性?我目前有一个这样的课程:
class Checkin: RLMObject {
dynamic var id: Int = 0
dynamic var kind: String = "checked_in"
var kindEnum: Kind = .CheckedIn {
willSet { self.kind = newValue.rawValue }
}
enum Kind: String {
case CheckedIn = "checked_in"
case EnRoute = "en_route"
case DroppedOff = "dropped_off"
}
....
}
它运行正常,但我希望能够将kind
属性设置为Enum并让Realm在将属性保存到属性时自动调用属性.rawValue
商店。这在Realm中是否可行,或者是否已有针对它的功能请求?
答案 0 :(得分:91)
对于这种情况,你应该覆盖kindEnum
的setter和getter:
enum Kind: String {
case CheckedIn
case EnRoute
case DroppedOff
}
class Checkin: Object {
@objc dynamic var id = 0
var kind = Kind.CheckedIn.rawValue
var kindEnum: Kind {
get {
return Kind(rawValue: kind)!
}
set {
kind = newValue.rawValue
}
}
}
答案 1 :(得分:42)
我已经进一步完善了这个模型。
enum Thing: String {
case Thing1
case Thing2
case Thing3
}
然后在我的Realm类对象中:
class myClass : Object {
private dynamic var privateThing = Thing.Thing1.rawValue
var thing: Thing {
get { return Thing(rawValue: privateThing)! }
set { privateThing = newValue.rawValue }
}
}
这允许我们写
myClassInstance.thing = .Thing1
(存储" Thing1"进入privateThing),但阻止输入
myClassInstance.privateThing = "Thing4"
这不是有效值,因此保留了数据完整性。
答案 2 :(得分:15)
由于Realm支持Objective-C枚举,并且Int
可以表示它们,您可以使用它:
class Checkin: Object {
dynamic var id: Int = 0
dynamic var kind: Kind = .checkedIn
@objc enum Kind: Int {
case checkedIn
case enRoute
case droppedOff
}
....
}
如果您需要解析String
来自Kind
,可以使用toString
和3.0
功能的自定义初始化程序。
这适用于Swift 2.0.2
和Realm storeBytes()
答案 3 :(得分:9)
Diogo T的解决方案在RealmSwift的最新更新之前有效。最终,我们现在必须符合RealmEnum
协议,才能成为Realm Object
的托管属性。
@objc enum MyEnum: Int, RealmEnum {
...
}
或在某些地方添加以下内容:
extension MyEnum: RealmEnum { }
答案 4 :(得分:0)
带有RealmEnum
和RealmOptional
的示例
@objc enum MyEnum: Int, RealmEnum {
case first
case second
}
final class MyEntry: Object {
//It should be let
let someVariable = RealmOptional<CRUD>()
}
//using
myEntry.someVariable.value = MyEnum.first
答案 5 :(得分:0)
避免强制解包的替代解决方案 get { return Thing(rawValue: privateThing)! }
enum Kind: String, CaseIterable {
case CheckedIn
case EnRoute
case DroppedOff
}
@objc dynamic var kindRaw = Kind.CheckedIn.rawValue
var kind: Kind {
get {
for kind in Kind.allCases where kindRaw == kind.rawValue {
return kind
}
return .CheckedIn //default
}
set {
kindRaw = newValue.rawValue
}
}