

別のクラスの配列の要素数が変化した場合にViewControllerで処理を行いたいです。

[code]

    //ViewController
    dataSource.addObserver(self, forKeyPath: "dataArray", options: .New, context: nil)
    
    override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
        if(keyPath == "dataArray"){
            println("変化!")
    
        }
    }
    
[/code]

この方法ではobserveValueForKeyPath内の処理が呼ばれませんでした。


CC BY-SA 3.0
2015-09-09T01:41:59.690
16409
2015-10-09T07:19:39.357
2015-09-09T05:00:42.437
8060
8060
question
ios swift
SwiftでArrayの要素数を監視したい


KVOではなく、Swiftの格納型プロパティのdidSetを使うのはどうでしょうか？

[code]

    import Foundation
    
    protocol CountObserver {
        func didChange(newCount :Int)
    }
    
    class ArrayContainer {
        weak var delegate :CountObserver?
    
        var dataArray = [Int]() {
            didSet {
                if(oldValue.count != dataArray.count){
                  delegate?.didChange(dataArray.count)
                }
            }
        }
    
        func doChange(){
            dataArray.append(Int(arc4random_uniform(100)))
        }
    }
    
[/code]

* * *

SwiftでObjective-CのKVO機構を使い、配列の要素を監視したい場合、

  * 監視元のオブジェクトはObjective-Cクラスでなければならない
  * 監視対象のプロパティはObjective-CのKVC準拠でなければならない

という2点の問題があり、特に厄介なのが`NSMutableArray`の`count`は監視不可能なプロパティということです。対処法としては手動で通知メソッドを書くか、`mutableArrayValueForKeyPath:`を使うかですが、どちらも表題の要件を簡単に満たすのは難しいです。


CC BY-SA 3.0
2015-09-09T05:03:22.323
16421
2015-09-09T06:25:27.497
2015-09-09T06:25:27.497
5337
5337
16409
answer