为什么我不能在Realm物业上使用private

时间:2019-07-19 13:17:05

标签: ios swift realm

我正在尝试将枚举案例存储在RealmSwift中。但是Realm不支持枚举。 This article提出了一个不错的解决方案。在其中,它们将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忽略了架构上的属性。

Another article实现相同的解决方案,但不使用private。我认为,如果有一种方法可以将Realm属性设为私有,那将是该解决方案的最佳实现。

是否可以将Realm类中的属性设为私有?如果没有,为什么?

1 个答案:

答案 0 :(得分:1)

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

首先,领域对象。该对象具有一个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")
    }
}