LoginSignup
22
22

More than 5 years have passed since last update.

RealmのフィールドにEnumとしてアクセスする

Posted at

About

RealmのフィールドにはEnum的な型のサポートはありませんが、フィールド値をEnumとして扱えた方が、プログラムの記述がスッキリすることが多いと思います。

色々と試行錯誤した結果、RealmObjectへのEnumの取り込み方は、このような感じに落ち着きました。

必ずtypeAsEnumプロパティを使うように気を付ける必要があったり、rawValueへのアクセサが隠蔽されていなかったりはしますが、switchのコーディングが楽になりました。

Java

public class Item extends RealmObject {
    public enum Type { TYPE1, TYPE2 }

    // 用途に応じてintでも良い
    private String type = Type.TYPE1.name();

    /** typeをEnumで扱うためのIgnoredプロパティ */
    @Ignore
    private Type typeAsEnum;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Type getTypeAsEnum() {
        return Type.valueOf(getType());
    }

    public void setTypeAsEnum(Type typeAsEnum) {
        setType(typeAsEnum.name());
    }
}

以下は利用例です。

// getter
switch (item.getTypeAsEnum()) {
   case Type1:
      break;
   case Type2:
      break;
}

// setter
item.setTypeAsEnum(Type.Type1);

Swift

class Item : RLMObject {
  enum Type : String {
    case Type1 = "Type1"
    case Type2 = "Type2"
  }

  // 用途に応じてIntでも良い
  dynamic var type: String = Type.Type1.rawValue

  /// typeをEnumで扱うためのプロパティ
  var typeAsEnum {
    get {
      return Type(rawValue: type)!
    }
    set {
      type = newValue.rawValue
    }
  }
}

以下は利用例です。

// getter
switch item.typeAsEnum {
   case .Type1:
   case .Type2:
}

// setter
item.typeAsEnum = .Type1
22
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
22