为什么我不能在 Realm 属性上使用私有



我正在尝试在 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")
    }
}

最新更新