为什么我不能在Realm物业上使用private [英] Why can't I use private on a Realm property

查看:81
本文介绍了为什么我不能在Realm物业上使用private的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将枚举案例存储在RealmSwift中.但是Realm不支持枚举. 本文提供了一个不错的解决方案.在它们中,它们将private放在Realm类中的一个属性的前面,以防止在类外部设置或读取它,然后在另一个属性上使用一些getter和setter对该私有属性进行读写./p>

这是该解决方案的我的版本:

@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类中的属性设为私有?如果没有,为什么?

解决方案

这很难回答,因为我们的项目具有类似的设置并且正在运行.因此,让我尝试通过示例说明代码的外观.

首先,领域对象.该对象具有一个ID,一个名称,然后是一个可见的属性revificationType,该属性通过一个枚举(不是由Realm管理)分配的,该枚举由一个由realm管理的私有revificationTypeRaw支持.

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")
    }
}

I am trying to store an enum case in RealmSwift. But Realm doesn't support enums. This article suggests a cool solution. In it they prepend private to the one property in the Realm class so as to prevent it from being set or read from outside the class, and then use some getters and setters on another property to read and write to that private property.

Here is my version of that solution:

@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"
    }

}

I tried to implement the solution but found that adding private to the one property was causing Realm to ignore the property on the schema.

Another article implements the same solution but without using private. If there is a way to make a Realm property private that would be the best implementation of the solution in my view.

Is there a way to make properties in a Realm class private? If not, why?

解决方案

This is tough to answer because our project has a similar setup and it's working. So let me try to present an answer via an example of what how our code looks.

First, the realm object. the object has an id, a name and then a visible property revisionType which is assigned via an enum (not managed by Realm) that's backed by a private revisionTypeRaw which is managed by realm.

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"
    }
}

then we create a couple of playlists and store in 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)

then to check it, load in all of the playlists and print to console depending on what type of revision they are

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")
    }
}

这篇关于为什么我不能在Realm物业上使用private的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆