Использование enum как свойства модели 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 или есть ли там какой-либо запрос функции?

+42
источник поделиться
3 ответа

Вы должны переопределить установщик kindEnum и getter для этого случая:

enum Kind: String {
  case CheckedIn
  case EnRoute
  case DroppedOff
}

class Checkin: Object {
  dynamic var id = 0
  dynamic var kind = Kind.CheckedIn.rawValue
  var kindEnum: Kind {
    get {
      return Kind(rawValue: kind)!
    }
    set {
      kind = newValue.rawValue
    }
  }
}
+67
источник

Я немного уточнил эту модель.

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"

который не является допустимым значением, таким образом сохраняя целостность данных.

+26
источник

Так как 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.

Об этом говорится в GitHub

Это работает с Swift 3.0 и Realm 2.0.2

+7
источник

Посмотрите другие вопросы по меткам или Задайте вопрос