首页 > 解决方案 > 如果条件 Swift,RealmSwift.Object 布尔值始终为 false

问题描述

我有一个具有这种结构的领域对象:

class SLevel: Object, Codable {
    @objc dynamic var id: Int = 0
    @objc dynamic var title: String? = nil
    @objc dynamic var notes: String? = nil
    @objc dynamic var image: String? = nil
    @objc dynamic var updateTime: Date = Date()
    @objc dynamic var isLock: Bool = true


    @objc dynamic var userLearnedWordsCache: Int = 0
    @objc dynamic var totalWordsCache: Int = 0
    @objc dynamic var progressCache: Int = 0
    @objc dynamic var lockedCache: Bool = false
    @objc dynamic var cached: Bool = false


    override static func primaryKey() -> String? {
        return "id"
    }

    private enum CodingKeys: String, CodingKey {
        case id,
        title,
        notes,
        image,
        updateTime,
        isLock
    }

    override static func ignoredProperties() -> [String] {
        return ["userLearnedWordsCache", "totalWordsCache", "progressCache", "lockedCache", "cached"]
    }
}

我有 Cellview 来构建数据列表。一切正常,但是当我尝试比较 .isLock 来检查一个值时,这个对象总是返回 false。但它在调试器上显示了真正的价值。

 let levelLockState = levels[indexPath.row]
        if levelLockState.isLock { // always return false but data is true
            cell.arrowImg.image = UIImage(named: "ic_lock")

        } else {
            cell.arrowImg.image = UIImage(named: "arrow-right")
        }

在此处输入图像描述

标签: iosswiftrealm

解决方案


调试器不会在监视窗口中显示托管对象(即从 Realm 查询中获得的对象)的正确数据——它将显示您在第一个代码部分中分配给对象的默认值。这是由于 Realm 代理对象的工作方式 - 由@objc dynamic类型声明中的使用定义。托管对象总是如此。

如果您愿意,可以使用该print命令逐个字段地显示实际数据值。在调试器的命令窗口(监视窗口右侧带有“(lldb)”提示符)键入:-

print levelLockState.isLock

(在您上面的示例中)并且结果应该是正确的。只要您指定值字段,这将起作用,但尝试使用此方法显示另一个 Realm 对象将再次给您同样的问题(例如print levelLockState,将再次给您零和零)。

正如@Jay 在下面的评论中所确定的那样,调试器只会在本地创建对象时显示正确的值(即它不是托管的)。


推荐阅读