Swift 4新知 KVC和KVO新姿勢

2021-09-11 10:04:51 字數 1294 閱讀 1345

隨著 keypath 得到增強,kvc 和 kvo 的 api 都有了一些進化。

乙個感人的進步就是 struct 也支援 kvc 了。但是並不是使用原有的setvalue:forkeypath的api。而是利用了swfit 4增加的乙個語法特性:自定義索引可以有引數名。

直接上**吧:

struct

valuetype

var object = valuetype(name: "zhuo")

let name = \valuetype.name

// set

object[keypath: name] = "swift4"

// get

let valueofname = object[keypath:name]複製**

通過索引可以方便的進行kvc。

遺憾的是依然只有 nsobject 才能支援 kvo。

swift 4中的乙個對此有影響的改變是繼承 nsobject 的 swift class 不再預設全部 bridge 到 oc。原因可以參考我的前一篇部落格:swift 4新知:自動清除冗餘**減小包大小。然而 kvo 又是乙個純 oc 的特性,所以如果是 swift class 需要在宣告的時候增加@objcmembers關鍵字。否則在執行的時候你會得到乙個 error:

fatal error: could not extract a string from keypath swift.referencewritablekeypath

另外一件事就是被觀察的屬性需要用dynamic修飾,否則也無法觀察到。

乙個好訊息是不需要在物件被**時手動 remove observer。但是這也帶來了另外乙個容易被忽略的事情:觀察的閉包沒有被強引用,需要我們自己新增引用,否則當前函式離開後這個觀察閉包就會被**了。

@objcmembers class

occlass: nsobject

}class

viewcontroller: uiviewcontroller

swiftclass.name = "swift4"

}}複製**

kvo 之後返回的是乙個nskeyvalueobservation例項,需要自己控制這個例項的生命週期。

參考:key value observation in ios 11

歡迎關注我的微博:@沒故事的卓同學

Swift 4 建構函式 KVC構造

viewcontroller.swift import uikit 在swift中 所有的類和類的方法 都是共享的 在同乙個命名空間 所有的類都是共享的 命名空間 是專案名稱 class viewcontroller uiviewcontroller person.swift 建構函式 分配記憶體空...

kvc和kvo的區別

on 2012 年 6 月 7 日,in iphone,by donly kvc 與 kvo 是 objective c 的關鍵概念,個人認為必須理解的東西,下面是例項講解。乙個物件擁有某些屬性。比如說,乙個 person 物件有乙個 name 和乙個 address 屬性。以 kvc 說法,per...

KVC和KVO底層原理

kvc和kvo想必都熟知的乙個名詞,觀察者模式,而kvo是基於kvc的,那麼kvc到底是個什麼,kvo又是什麼,那麼它們之間是怎麼關聯的。當你了解kvc機制,會恍然大悟,只要知道乙個ui的結構,就能對他做任意的修改。而kvo是觀察者模式的一種實現,對物件屬性監聽能達到乙個高效能處理,所以了解kvc和...