我的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 对象?
答案 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。