Swift 4 KVO 筆記

閒來無事寫個東西

David Lin
2 min readSep 4, 2017

在 Swift 4.0 以前,KVO 是一個能不碰盡量不碰的的東西,不過在 Objc 卻是一個大家都喜歡用的東西。Swift 4.0 在今年六月 WWDC 對 KVO 做了一些 API 上的調整,讓它用起來更安心更簡單了。

Swift 4.0 中新加入了 Key Paths 這個東西,可以讓取得某個物件下的值更簡單:

也因此我們在 observe 一個 keypath 時,不用怕打錯字,他會在 compile 時就幫我們檢查了。我們來看一下新的 KVO API 提供了我們什麼新奇的事物可以玩,先看看以下這段 code:

可以看到設定好 KVO 後我們就可以像以前在 Objc 一樣 observe 某個 keypath 的值了。注意看一下 options 的地方我們給了 .inital.old 兩個 options,這邊的意思是,我要 observe mia 的一開始的值,跟 age 變化前的值。所以在這個 observation 被建立時,KVO 就會先被觸發一次。接著每當 mia 的 age 要變化,KVO 會通知我們,mia 的 age 即將發生變化,我們可以在他的值要被改變前,做出相對應的事。

KVO options(NSKeyValueObservingOptions) 一共有四種:

new, old, initial, prior

  • 如果你需要 observe 初始值(initial)可以在 options 中加上 .initial,KVO 觸發時你會拿到 newValue,初始值在此會跟 newValue 一樣,且 isPrior 是 false
  • 值在變化前,KVO 會給你變化前的值(oldValue),且 isPrior 是 true
  • 值在變化後,KVO 會給你變化前後的值(old+new Value),isPrior 是 false

由此可見 isPrior 可以用來判斷此 notification 為變化前後的基準。

--

--

Responses (1)