Swift中的键值观察4

joh*_*doe 5 key-value-observing swift swift4

我在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()
    }
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*tti 6

我认为原因changenil因为你没有指定选项.

重写如下:

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()
}
Run Code Online (Sandbox Code Playgroud)

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

更新:此要求现已反映在此处的官方Apple文档中.

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