Swift中的键值观察4

时间:2017-09-28 19:31:54

标签: swift swift4 key-value-observing

我的Swift 4项目中有以下代码。

class DishesTableViewController : UITableViewController {


    private var token :NSKeyValueObservation?

    @objc dynamic private(set) var dishes :[Dish] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        // configure the observation
        token = self.observe(\.dishes) { object, change in

            // change is always nil
            print(object)
            print(change)
        }

        updateTableView()
    }

每当更换餐具阵列时,都会触发观察。但我的问题是如何才能获得发生的实际更改,也就是说,如何访问触发更改的实际 Dish 对象?

1 个答案:

答案 0 :(得分:6)

我认为change提出nil的原因是因为您还没有指定选项。

重写如下:

override func viewDidLoad() {
    super.viewDidLoad()

    // configure the observation
    token = self.observe(\.dishes, options: [.new,.old]) { object, change in

        print(object)
        let set1 = Set(change.newArray!)
        let set2 = Set(change.oldArray!)

        let filter = Array(set1.subtract(set2))
        print(filter)

    }

    updateTableView()
}

请注意,我在这里对你的Dish对象做了一些猜测。我假设您已使其符合Equatable协议,这是解决方案工作的必要步骤。

更新:此要求现已反映在官方Apple文档here中。

  

如果您不需要知道属性的更改方式,请省略options参数。省略options参数以放弃存储新旧属性值,导致oldValue和newValue属性为nil。