我正在尝试将枚举案例存储在RealmSwift中。但是Realm不支持枚举。 This article提出了一个不错的解决方案。在其中,它们将private
放在Realm类中的一个属性的前面,以防止在类外部设置或读取该属性,然后在另一个属性上使用一些getter和setter对该私有属性进行读写
这是该解决方案的我的版本:
@objcMembers
class PlaylistRealmObject: Object {
dynamic var id: String = UUID().uuidString
dynamic var created: Date = Date()
dynamic var title: String = ""
private dynamic var revisionTypeRaw: String = RevisionType.noReminder.rawValue
var revisionType: RevisionType {
get { return RevisionType(rawValue: revisionTypeRaw)! }
set { revisionTypeRaw = newValue.rawValue }
}
let reminders = List<ReminderRealmObject>()
let cardsInPlaylist = List<CardRealmObject>()
override static func primaryKey() -> String? {
return "id"
}
}
我尝试实现该解决方案,但发现将private
添加到一个属性中导致Realm忽略了架构上的属性。
Another article实现相同的解决方案,但不使用private。我认为,如果有一种方法可以将Realm属性设为私有,那将是该解决方案的最佳实现。
是否可以将Realm类中的属性设为私有?如果没有,为什么?
答案 0 :(得分:1)
这很难回答,因为我们的项目具有类似的设置并且正在运行。因此,让我尝试通过示例说明代码的外观。
首先,领域对象。该对象具有一个ID,一个名称,然后是一个可见的属性revificationType,该属性通过一个枚举(不由Realm管理)分配,该枚举由一个由realm管理的私有revificationTypeRaw支持。
class PlaylistRealmObject: Object {
enum RevisionTypeEnum: String {
case type_a = "a"
case type_b = "b"
}
@objc dynamic var list_id = UUID().uuidString
@objc dynamic var list_name = ""
@objc private dynamic var revisionTypeRaw: String = ""
var revisionType: RevisionTypeEnum {
get {
let x = RevisionTypeEnum(rawValue: revisionTypeRaw)!
return x
}
set {
revisionTypeRaw = newValue.rawValue
}
}
override static func primaryKey() -> String? {
return "list_id"
}
}
然后我们创建几个播放列表并存储在Realm中
let newAgePlaylist = PlaylistRealmObject()
newAgePlaylist.list_name = "New Age"
newAgePlaylist.revisionType = .type_a
let classicRockPlaylist = PlaylistRealmObject()
classicRockPlaylist.list_name = "Classic Rock"
classicRockPlaylist.revisionType = .type_b
realm.add(newAgePlaylist)
realm.add(classicRockPlaylist)
然后进行检查,加载所有播放列表并根据其修订版本打印到控制台
let playlistResults = realm.objects(PlaylistRealmObject.self)
for playlist in playlistResults {
let name = playlist.list_name
if playlist.revisionType == .type_a {
print("name: \(name) is a type_a playlist")
} else {
print("name: \(name) is a type_b playlist")
}
}