天天看點

iOS - KVC 鍵值編碼1、KVC2、資料模型3、KVC 指派與取值4、KVC 異常處理5、KVC 消息傳遞6、KVC 字典轉模型 資料備援處理

KVC 是 Key-Value Coding 的簡寫,是鍵值編碼的意思,屬于 runtime 方法。Key Value Coding 是 cocoa 的一個标準組成部分,是間接給對象屬性設定數值的方法,它能讓我們可以通過 name(key) 的方式通路屬性變量, 不必調用明确的屬性通路方法, 如我們有個屬性變量叫做 foo, 我們可以 foo 直接通路它,同樣我們也可以用 KVC 來完成 [Object valueForKey:@“foo”], 這樣做主要的好處就是來減少我們的代碼量。

程式執行過程中,KVC 動态給對象屬性設定數值,不關心屬性在 .h 和 .m 中是如何定義的,隻要對象有屬性,就能夠讀取和設定。這種方式,有點違背程式的開發原則。

在 iOS 中,用 KVC 用的最多是核心動畫,核心動畫是通過 KVC 對塗層的可動畫屬性設定數值來實作的。

模型是專門用來存放資料的對象,一般都是一些直接繼承自 NSObject 的純對象,内部會提供一些屬性來存放資料,控制器可以直接傳遞模型給視圖控件以顯示空間的内容。

1)用模型取代字典的好處

使用字典的壞處:

一般情況下,設定資料和取出資料都使用 “字元串類型的 key”,編寫這些 key 時,編輯器沒有智能提示,需要手敲,手敲字元串 key,key 容易寫錯,Key 如果寫錯了,編譯器不會有任何警告和報錯,造成設錯資料或者取錯資料。如:

使用模型的好處:

所謂模型,其實就是資料模型,專門用來存放資料的對象,用它來表示資料會更加專業。模型設定資料和取出資料都是通過它的屬性,屬性名如果寫錯了,編譯器會馬上報錯,是以,保證了資料的正确性

使用模型通路屬性時,編譯器會提供一系列的提示,提高編碼效率。

2)字典轉模型

字典轉模型的過程最好封裝在模型内部。

模型應該提供一個可以傳入字典參數的構造方法。

3)字典轉模型 KVC 方法

字典轉模型:setValuesForKeysWithDictionary

字典中的 key 值需與要指派的對象的屬性變量名相同,并且都為字元串類型。

模型轉字典:dictionaryWithValuesForKeys

參數是要被轉換到字典中的屬性名稱

4)KVC 資料模型的設定

為了避免服務端傳回的數值型資料是 null,可以把數值型的資料設定成 NSNumber 類型,否則會報錯 could not set nil as the value for the key messageId 。

id 是服務端最喜歡用的屬性,id 在 iOS 中是關鍵字,但在模型中可以正常使用的。

copy 屬性,在設定數值的時候,如果有一方是可變的,會預設做一次 copy 操作,會建立新的副本,在模型中對象全都是用 copy 屬性會比較安全。

定義為 copy 的屬性,重寫了 setter 方法之後,定義屬性的 copy 就是擺設了,不會預設進行 copy 操作,必須要自己 copy 一下,否則設定數值的時候,不會 copy。

5)字典轉模型的過程

iOS - KVC 鍵值編碼1、KVC2、資料模型3、KVC 指派與取值4、KVC 異常處理5、KVC 消息傳遞6、KVC 字典轉模型 資料備援處理

KVC 是一種操作全局變量的方法,無論是公有的,私有的,還是受保護的全都可以操作。

1、找對象的 setter 方法,找到就執行;

2、找不到 setter 方法就找 _name 變量,找到就指派;

3、如果找不到 _name 變量,就找 name;

4、如果 name 也找不到就會讓對象調用 -(void)setValue:forUnderfinedKey; 方法處理異常。

Objective-C

KvcClass.h

SubKvcClass.h

ViewController.m

Swift

KvcClass.swift

SubKvcClass.swift

ViewController.swift

必須得有标準的 getter 和 setter 方法,或者用 @property 聲明。

調用 setValue: forKey: 方法以字元串的方式向對象發送消息,設定執行個體變量的值。第一個參數是要設定的值,第二個參數是執行個體變量的名稱。

調用 valueForKey: 來擷取執行個體變量的值。

如果執行個體變量中有其他類的對象,那麼可以使用 setValue: forKeyPath: 給其他類的對象的屬性變量指派。

字典中的 key 值需與要指派的對象的屬性變量名相同。并且都為字元串類型。

在鍵值編碼的類中使用以下兩個方法處理 key 值不存在的異常。如果不做處理,編譯時系統會報錯。

KvcClass.m

在需要處理的資料源中有系統關鍵字時,在鍵值編碼處理的類中使用以下兩個方法處理 key 值為系統關鍵字的情況。

valueForKey: 的使用并不僅僅用來取值那麼簡單,還有很多特殊的用法,集合類也覆寫了這個方法,通過調用 valueForKey: 給容器中每一個對象發送操作消息,并且結果會被儲存在一個新的容器中傳回,這樣我們能很友善地利用一個容器對象建立另一個容器對象。另外,valueForKeyPath: 還能實作多個消息的傳遞。

字典中元素與模型中的屬性數量不想等的情況處理。處理 key 值不存在的異常。如果不做處理,編譯時系統會報錯。

繼續閱讀