我正在尝试在 RealmSwift 中存储一个枚举案例。但 Realm 不支持枚举。本文 https://medium.com/it-works-locally/persisting-swift-enumerations-with-realm-io-dab37cd98bcd建议一个很酷的解决方案。他们在其中前置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 忽略架构上的属性。
另一篇文章 https://forum.realm.io/t/how-to-create-custom-types/1122/2实现相同的解决方案,但不使用 private。在我看来,如果有一种方法可以将 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")
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)