Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using enum as property of Realm model

Tags:

enums

ios

realm

Is it possible to use an Enum as a property for my model? I currently have a class like this:

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"   }   .... } 

It works okay, but I'd like to be able to have the kind property be the Enum and have Realm automatically call .rawValue on the property when it is saving an object to the store. Is this possible in Realm or is there a feature request already out there for it?

like image 534
Dave Long Avatar asked Mar 18 '15 13:03

Dave Long


2 Answers

You should override your kindEnum's setter and getter for this case:

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     }   } } 
like image 158
jpsim Avatar answered Oct 01 '22 21:10

jpsim


I've refined this model a little further.

enum Thing: String {     case Thing1     case Thing2     case Thing3 } 

then in my Realm class object:

class myClass : Object {     private dynamic var privateThing = Thing.Thing1.rawValue     var thing: Thing {         get { return Thing(rawValue: privateThing)! }         set { privateThing = newValue.rawValue }     } } 

This allows us to write

myClassInstance.thing = .Thing1 

(storing "Thing1" into privateThing), but prevents typing of

myClassInstance.privateThing = "Thing4" 

which is not a valid value so preserving data integrity.

like image 26
Stephen Watson Avatar answered Oct 01 '22 22:10

Stephen Watson