具有getter / setter的域对象属性始终返回第一个存储值

时间:2016-08-23 15:00:45

标签: ios swift realm

我有一个领域对象:

class RMovements: Object {
    dynamic var name: String!
    dynamic var _quantity: Double = 0
    var quantity: Double {
        get {
            return _quantity / 1000
        }
        set {
            _quantity = newValue * 1000
        }
    }

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

在领域商店中创建此对象

do {
    try realm.write({
        let m = RMovements()
        m.name = "john"
        m.quantity = 2
        realm.add(m, update: true)
    })
} catch _ {}

结果我得到了

RMovements {
    name = john;
    _quantity = 2000;
    quantity = 2;
}

看起来不错!但现在我想把数量改为9

do {
    try realm.write({
        let m = realm.objects(RMovements).filter("name=%@", "john").last!
        m.quantity = 9
        realm.add(m, update: true)
    })
} catch _ {}

这是惊喜

RMovements {
    name = john;
    _quantity = 9000;
    quantity = 2;
}

_quantity正确地更改为9000,但数量仍为2。 为什么数量仍然是2?它将始终返回第一个存储值,我不明白为什么。请帮忙。

GitHub

上的演示项目

1 个答案:

答案 0 :(得分:0)

这里发生的事情是,quantity属性并未包含在ignoredProperties()中,以让Realm知道不要坚持它,但它也没有被标记{ {1}},它使Realm能够管理属性。

所以它处于这种不支持的中间状态。我建议你将该属性标记为忽略:

dynamic

请注意class RMovements: Object { dynamic var name: String! dynamic var _quantity: Double = 0 var quantity: Double { get { return _quantity / 1000 } set { _quantity = newValue * 1000 } } override static func primaryKey() -> String? { return "name" } override static func ignoredProperties() -> [String] { return ["quantity"] } } 的默认Object不包含已忽略的属性,因此要打印它,您需要覆盖它:

description

然后,如果我运行您的样本,我将获得以下日志:

override var description: String {
    return "RMovements {\n    name = \(name);\n    _quantity = \(_quantity);\n    quantity = \(quantity);\n}"
}