web-dev-qa-db-ja.com

レルムモデルのプロパティとして列挙型を使用する

モデルのプロパティとして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で可能ですか、それともすでに機能要求がありますか?

59
Dave Long

この場合、kindEnumのセッターとゲッターをオーバーライドする必要があります。

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
    }
  }
}
91
jpsim

このモデルをもう少し改良しました。

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"

これは有効な値ではないため、データの整合性が保持されます。

44
Stephen Watson

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およびレルム2.0.2

15
Diogo T