使用enum作为Realm模型的属性

时间:2015-03-18 13:22:00

标签: ios enums realm

是否可以将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中是否可行,或者是否已有针对它的功能请求?

6 个答案:

答案 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,可以使用toString3.0功能的自定义初始化程序。

GitHub

中对此进行了讨论

这适用于Swift 2.0.2和Realm storeBytes()

答案 3 :(得分:9)

Diogo T的解决方案在RealmSwift的最新更新之前有效。最终,我们现在必须符合RealmEnum协议,才能成为Realm Object的托管属性。

@objc enum MyEnum: Int, RealmEnum {
    ...
}

或在某些地方添加以下内容:

extension MyEnum: RealmEnum { }

RealmSwift documentation for it

答案 4 :(得分:0)

带有RealmEnumRealmOptional的示例

@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
        }
    }