为什么我不能在 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")
    }
}