如何在Swift(或ObjectiveC)中观察对象的所有类成员的更改?

时间:2016-04-20 16:32:43

标签: objective-c swift

我有类似

的课程
class Foo {
  var bar : Int = 0
  var baz : Boolean = false

  var updated_at : NSDate
}

我可以从NSObject继承类(如果有一些可以使用的Objective-C好东西)。

我想让一些代码在每次更改bar或baz时自动更新updated_at

为每个成员提供更新willSet的明显解决方案(添加didSetupdated_at)。

但是,需要将willSetdidSet添加到每个类成员。结果,如果有100个,我将需要100个代码副本(我真的不喜欢)

我正在寻找一种方法,我如何编写一段代码(对多个副本)来观察所有成员的变化。

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是将barbaz合并到一个触发更新的元组中,然后将didSet添加到其中:

class Foo {

    var values: (bar: Int, baz: Bool) = (0, false) {

            didSet {
                self.updated_at = NSDate()
            }
        }

    var updated_at  = NSDate()
}

像这样访问它们:

let foo = Foo()
foo.values.bar = 10  // will trigger the didSet method

此方法的一个优点是您可以添加不会触发更新的values元组之外的其他属性。例如,我认为您不希望对updated_at进行更改以触发对updated_at的更改,因此观看每个属性的方法都不起作用 - 它会看{ {1}}属性!

答案 1 :(得分:1)

这可以通过以下方式在目标C中实现:

  • (NSSet *)keyPathsForValuesAffecting { return [NSSet setWithObject:@“bar”,@“baz”,nil]; }

然后为updated_at添加自定义setter。请点击此链接了解详情。 https://www.objc.io/issues/7-foundation/key-value-coding-and-observing/