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
Example with RealmEnum
and RealmOptional
@objc enum MyEnum: Int, RealmEnum {
case first
case second
}
final class MyEntry: Object {
//It should be let
let someVariable = RealmOptional<CRUD>()
}
//using
myEntry.someVariable.value = MyEnum.first
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.
Diogo T's solution worked before recent updates of RealmSwift. Eventually we now have to conform to RealmEnum
protocol to be able to be a managed property of Realm Object
.
@objc enum MyEnum: Int, RealmEnum {
...
}
Or add below in some place:
extension MyEnum: RealmEnum { }
RealmSwift documentation for it
Since Realm support Objective-C enums and they are representable by Int
you can use this:
class Checkin: Object {
dynamic var id: Int = 0
dynamic var kind: Kind = .checkedIn
@objc enum Kind: Int {
case checkedIn
case enRoute
case droppedOff
}
....
}
If you need to parse to/from String
you can use a custom initializer for Kind
and an toString
function.
There is a discussion about this in GitHub
This works with Swift 3.0
and Realm 2.0.2
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
}
}
}