ios - 如果条件 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")
}
解决方案
调试器不会在监视窗口中显示托管对象(即从 Realm 查询中获得的对象)的正确数据——它将显示您在第一个代码部分中分配给对象的默认值。这是由于 Realm 代理对象的工作方式 - 由@objc dynamic
类型声明中的使用定义。托管对象总是如此。
如果您愿意,可以使用该print
命令逐个字段地显示实际数据值。在调试器的命令窗口(监视窗口右侧带有“(lldb)”提示符)键入:-
print levelLockState.isLock
(在您上面的示例中)并且结果应该是正确的。只要您指定值字段,这将起作用,但尝试使用此方法显示另一个 Realm 对象将再次给您同样的问题(例如print levelLockState
,将再次给您零和零)。
正如@Jay 在下面的评论中所确定的那样,调试器只会在本地创建对象时显示正确的值(即它不是托管的)。
推荐阅读
- c# - 如何使用 AND / OR 运算符有效地将布尔列表减少为单个结果
- python - 有人可以解释 .extend() 如何在这个例子中深入工作吗?
- android - 从匕首 2 获取空实例
- c++ - 链表的 Push_front 和 push_back 方法似乎删除了一个节点
- azure - 如何在逻辑应用程序中使用撰写连接器创建新的 json 对象而不改变顺序?
- python - 如何演示python GIL(我怎么知道一次只有一个线程在执行)
- serial-port - 读取串行设备将输出复制到输入
- c# - UWP 文件缩略图保存在 SQL Server 数据库中
- azure - elasticsearch 天蓝色存储库验证异常
- mysql - 如何将 APNS/FCM 的推送设备令牌存储在带有索引的 MySQL 数据库中?