我正在尝试在 RealmSwift 中存储一个枚举案例。但是 Realm 不支持枚举。本文提出了一个很酷的解决方案。在其中,他们将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 忽略架构上的属性。
另一篇文章实现了相同的解决方案,但没有使用私有。如果有一种方法可以使 Realm 属性私有,在我看来,这将是解决方案的最佳实现。
有没有办法使 Realm 类中的属性私有?如果没有,为什么?
这很难回答,因为我们的项目具有类似的设置并且正在工作。因此,让我尝试通过一个示例来提供答案,说明我们的代码的外观。
首先是 realm 对象。对象有一个 id、一个名称,然后是一个可见的属性 revisionType,它通过一个枚举(不由 Realm 管理(赋值,该枚举由一个由 Realm 管理的私有 revisionTypeRaw 提供支持。
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")
}
}