文書   >   Swift   >  Cocoa Design Patterns   >   Using Key-Value Observing in Swift


記事


Using Key-Value Observing in Swift
(Swift でキー値監視を使用する)


他のオブジェクトのプロパティの変更についてオブジェクトに通知します。





概観


キー値監視は、他のオブジェクトのプロパティの変更についてオブジェクトに通知するために使用する Cocoa プログラミングパターンです。モデルとビューの間など、アプリの論理的に分離された部分の間で変更を伝達するのに役立ちます。 NSObject から継承するクラスでのみキー値監視を使用できます。


キー値監視用のプロパティに注釈を付ける


@objc 属性と dynamic 修飾子の両方を使用して、キー値監視で監視したいプロパティをマークします。以下の例では、監視できるプロパティ、myDate を使用して MyObjectToObserve クラスを定義しています。


class MyObjectToObserve: NSObject {
    @objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970
    func updateDate() {
        myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years.
    }
}


監視者の定義


監視者 (observer) クラスのインスタンスは、1 つ以上のプロパティに加えられた変更に関する情報を管理します。監視者を作成する場合、監視したいプロパティを参照するキーパスを指定して observe(_:options:changeHandler:) メソッドを呼び出して、監視を開始します。


以下の例では、\.objectToObserve.myDate キーパスは MyObjectToObservemyDate プロパティを参照しています。


class MyObserver: NSObject {
    @objc var objectToObserve: MyObjectToObserve
    var observation: NSKeyValueObservation?
    
    init(object: MyObjectToObserve) {
        objectToObserve = object
        super.init()
        
        observation = observe(
            \.objectToObserve.myDate,
            options: [.old, .new]
        ) { object, change in
            print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
        }
    }
}


NSKeyValueObservedChange インスタンスの oldValue プロパティと newValue プロパティを使用して、監視しているプロパティの変更点を確認します。


プロパティの変更 方法 を知る必要がない場合は、options パラメータを省略して下さい。options パラメータを省略すると、新しいプロパティ値と古いプロパティ値の保存が不要になり、oldValue プロパティと newValue プロパティは nil になります。


監視者と監視すべきプロパティに関連付ける


監視者のイニシャライザにオブジェクトを渡すことで、その監視者と監視したいプロパティを関連付けます。


let observed = MyObjectToObserve()
let observer = MyObserver(object: observed)


プロパティの変更に対応する


キー値監視 (上記の observed など) を使用するように設定されているオブジェクトは、プロパティの変更について、それの監視者に通知します。以下の例では、updateDate メソッドを呼び出して myDate プロパティを変更しています。そのメソッドの呼び出しは、監視者の変更ハンドラを自動的にトリガーします。


observed.updateDate() // Triggers the observer's change handler.
// Prints "myDate changed from: 1970-01-01 00:00:00 +0000, updated to: 2038-01-19 03:14:08 +0000"


以下も見よ





共通のパターン

















トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)
目次
Xcode 11 の新機能

Swift 標準ライブラリ
  • 概観
  • 以下も見よ












  • トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)