Help us understand the problem. What is going on with this article?

Swift4以降のKVOについて

はじめに

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

参考文献

k_awoki
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away