Article

Using Key-Value Observing in Swift Swiftにおいてキー値監視を使用する

Notify objects about changes to the properties of other objects. 他のオブジェクトのプロパティに対する変更についてオブジェクトに通知します。

Overview 概要

Key-value observing is a Cocoa programming pattern you use to notify objects about changes to properties of other objects. It's useful for communicating changes between logically separated parts of your app—such as between models and views. You can only use key-value observing with classes that inherit from NSObject. キー値監視は、他のオブジェクトのプロパティに対する変更を通知するためにあなたが使うCocoaプログラミングパターンです。それは、あなたのアプリの論理的に分離された部分の間で変更を伝えるために役立ちます — 例えばモデルとビューの間など。あなたはキー値監視を、NSObjectから継承するクラスでのみ使うことができます。

Annotate a Property for Key-Value Observing キー値監視のためのプロパティに注釈をつける

Mark properties that you want to observe through key-value observing with both the @objc attribute and the dynamic modifier. The example below defines the MyObjectToObserve class with a property—myDate—that can be observed: あなたがキー値監視を通して監視したいプロパティを@objc属性とdynamic修飾子の両方で印してください。下の例は、MyObjectToObserveクラスを、監視されることが可能なプロパティ — myDate — で定義します:


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

Define an Observer オブザーバを定義する

An instance of an observer class manages information about changes made to one or more properties. When you create an observer, you start observation by calling the observe(_:options:changeHandler:) method with a key path that refers to the property you want to observe. オブザーバクラスのあるインスタンスは、ひとつ以上のプロパティに対してなされる変更についての情報を管理します。あなたがオブザーバを作成する場合、あなたはobserve(_:options:changeHandler:)メソッドを、あなたが監視したいプロパティを参照するキーパスとともに呼び出すことによって監視を開始します。

In the example below, the \.objectToObserve.myDate key path refers to the myDate property of MyObjectToObserve: 下の例において、\.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!)")
        }
    }
}

You use the oldValue and newValue properties of the NSKeyValueObservedChange instance to see what's changed about the property you're observing. あなたは、NSKeyValueObservedChangeインスタンスのoldValuenewValueプロパティを使って、あなたが監視しているプロパティについて変更されるのが何か見ます。

If you don't need to know how a property has changed, omit the options parameter. Omitting the options parameter forgoes storing the new and old property values, which causes the oldValue and newValue properties to be nil. あなたがどのようにプロパティが変更されたか知る必要がないならば、optionsパラメータを省略します。optionsパラメータを省略することは、新しいそして古いプロパティ値を格納することをやめます、それはoldValuenewValueプロパティがnilになる原因となります。

Associate the Observer with the Property to Observe 監視するプロパティとオブザーバを結びつける

You associate the property you want to observe with its observer by passing the object to the initializer of the observer: あなたは、あなたが監視を望むプロパティをそれのオブザーバと、オブジェクトをオブザーバのイニシャライザを渡すことによって結びつけます:


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

Respond to a Property Change プロパティの変更に応答する

Objects that are set up to use key-value observing—such as observed above—notify their observers about property changes. The example below changes the myDate property by calling the updateDate method. That method call automatically triggers the observer's change handler: キー値監視を使うように設定されるそれらオブジェクト — 例えば上のobserved — は、それらのオブザーバにプロパティの変化について通知します。下の例は、myDateプロパティを、updateDateメソッドを呼び出すことによって変更します。そのメソッド呼び出しは、自動的にオブザーバの持つ変更ハンドラを誘発します:


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"

The example above responds to the property change by printing both the new and old values of the date. 上の例は、プロパティの変化に、日付の新旧の値の両方をプリントすることによって応答します。

See Also 参照

Common Patterns 共通パターン