Using enum as property of Realm model
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
}
}
}
Realm 10.0.0 introduces PersistableEnum
Protocol that makes it easy to persist enum values without any third-party extensions.
enum TaskStatusEnum: String, PersistableEnum {
case notStarted
case inProgress
case complete
}
// To use the enum:
class Task: Object {
// Required enum property
@Persisted var status = TaskStatusEnum.notStarted
// Optional enum property
@Persisted var optionalTaskStatusEnumProperty: TaskStatusEnum?
}
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.
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