モデルのプロパティとして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で可能ですか、それともすでに機能要求がありますか?
この場合、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
}
}
}
このモデルをもう少し改良しました。
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"
これは有効な値ではないため、データの整合性が保持されます。
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