RealmSwift.Object Значение bool всегда ложно, если условие Swift - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть объект Realm со следующей структурой:

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

enter image description here

1 Ответ

0 голосов
/ 30 сентября 2019

Отладчик не показывает правильные данные в окне наблюдения для управляемых объектов (то есть тех, которые получены из запросов Realm) - он покажет значения по умолчанию, которые вы назначаете объекту, как в первом разделе кода. Это связано с тем, как работают прокси-объекты Realm - как определено использованием @objc dynamic в объявлении типа. Это всегда будет иметь место с управляемыми объектами.

Вы можете использовать команду print для отображения фактических значений данных по полю, если хотите. В командном окне отладчика (с приглашением '(lldb)' справа от окна просмотра) введите: -

print levelLockState.isLock

(в случае вашего примера выше), и результат должен быть правильным,Это будет работать до тех пор, пока вы укажете поля значений, но попытка отобразить другой объект Realm с помощью этого метода снова вызовет ту же проблему (например, print levelLockState даст вам нули и нули снова).

As @Джей определил в своих комментариях ниже, что отладчик будет показывать правильные значения только тогда, когда объект был создан локально (т.е. он не управляется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...