2017-09-28 7 views
5

スウィフト4プロジェクトには次のコードがあります。スウィフト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() 
    } 

皿アレイが変更されるたびに、観察がトリガされる。しかし、私の質問は、実際に起こった変更をどうすれば得ることができるかということです。意味私はどのように変更を引き起こした実際のディッシュオブジェクトにアクセスすることができます。

答えて

4

は、nilという理由があると思います。オプションを指定していないためです。

書き換え次のように:私はあなたのDishオブジェクトについてはこちらを当て推量のビットを行っている

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() 
} 

注意。私はあなたがEquatableプロトコルに準拠させたと仮定しています。これはソリューションが動作するために必要なステップです。

+0

私の場合、 'changeHandler'は' options'引数を含んでいなかったので完全に呼び出されませんでした。私はいつもそれを含めてお勧めします。 –