为什么我不能在 Realm 属性 上使用 private
Why can't I use private on a Realm property
我正在尝试在 RealmSwift 中存储一个枚举案例。但是 Realm 不支持枚举。 This article 提出了一个很酷的解决方案。在其中,他们将 private
添加到领域 class 中的 属性 以防止它被设置或从 class 外部读取,然后使用一些吸气剂和另一个 属性 上的 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 class 中的属性私有化?如果不是,为什么?
这很难回答,因为我们的项目具有类似的设置并且正在运行。因此,让我尝试通过我们的代码外观示例来给出答案。
首先,领域对象。该对象有一个 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")
}
}
我正在尝试在 RealmSwift 中存储一个枚举案例。但是 Realm 不支持枚举。 This article 提出了一个很酷的解决方案。在其中,他们将 private
添加到领域 class 中的 属性 以防止它被设置或从 class 外部读取,然后使用一些吸气剂和另一个 属性 上的 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 class 中的属性私有化?如果不是,为什么?
这很难回答,因为我们的项目具有类似的设置并且正在运行。因此,让我尝试通过我们的代码外观示例来给出答案。
首先,领域对象。该对象有一个 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")
}
}