LoginSignup
16
8

More than 3 years have passed since last update.

Swift4以降のKVOについて

Posted at

はじめに

KVOとはKey-Value Observingの略で、対象のObjectの値を監視し、変更のタイミングで通知を行ってくれるものです。
とても簡単に特定の値の監視を行うことができますので、今回はその使い方についてまとめてみました。

KVOの使い方

監視の登録方法について

Objectの値の監視を登録するにはobserve(_:options:changeHandler:)を使用します。
各引数の説明を簡単に行います。

func observe<Value>(_ keyPath: KeyPath<T, Value>, options: NSKeyValueObservingOptions = [], changeHandler: @escaping (T, NSKeyValueObservedChange<Value>) -> Void) -> NSKeyValueObservation
  • keyPath : KeyPath形式で監視したいObjectの値を指定
  • options : 変更前後、どの値を通知してもらうか指定するオプション
  • changeHandler : Value変更時に呼ばれるHandler
    • T : 対象のObject
    • NSKeyValueObservedChange<Value> : 監視対象の値の変更時の値を格納

実例

では実例を見ていきましょう、使い方は簡単です。
下の例ではviewframeの変更時に通知をするよう処理を記述しています。

/// インスタンスを保持
var observations = [NSKeyValueObservation]()

/// Objectの値の監視を追加
func addKeyValueObserver() {
    let observation = view.observe(\.frame, options: [.new, .old], changeHandler: { object, change in
        // value変更時の処理を記載
        print("変更前の値: \(change.newValue), 変更後の値: \(change.oldValue)")
    })
    observations.append(observation)
}

/// 監視を停止し、インスタンスを削除
func removeKeyValueObserver() {
    // 監視を停止
    observations.forEach({ $0.invalidate() })
    observations.removeAll()
}

optionsで設定している値はnewで変更後の値を通知するよう指定、oldで変更前の値を通知するよう指定できます。
ちなみに変更が通知された際に、変更された値の中身を確認する必要がない場合はoptions:は省略することができます。
その場合は、newValueおよびoldValuenilになります。

KVOの使い所

プロパティを外から監視できる

既存のframeworkのプロパティなど、変化を検知したいが検知するためのdelegateが存在しない場合などは、KVOを使用して該当のプロパティ対して外から監視を行い、プロパティの変更を検知をすることができます。

おわりに

KVOを使用することで簡単にプロパティの監視を行うことが出来ますので、是非使い所を見つけて使ってみてください。

参考文献

16
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
8