iOS --- KVC底層原理及應(yīng)用

KVC(KeyValueCoding)

(1)賦值類方法

- (void)setValue:(nullableid)value forKey:(NSString*)key;

- (void)setValue:(nullableid)value forKeyPath:(NSString*)keyPath;- (void)setValue:(nullableid)value forUndefinedKey:(NSString*)key;

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;

(2)取值類方法// 能取得私有成員變量的值

- (id)valueForKey:(NSString*)key;

- (id)valueForKeyPath:(NSString*)keyPath;

- (NSDictionary*)dictionaryWithValuesForKeys:(NSArray*)keys;

KVC 底層實現(xiàn)原理

假設(shè)key = @"name", 以下順序執(zhí)行,前一條件不成立,則執(zhí)行下一個。

1.? 判斷是否有@"name"的set方法,有則賦值;

2. 判斷有無_name(帶下劃線的)成員變量,有則賦值

3. 判斷有無同名屬性,有則賦值

4. 執(zhí)行valueforUndefinedKey, setValue:forUndefinedKey:

KVC使用場景:

Person *p = [[Person alloc] init];

p.name = @"rose";

使用setValue:forKey:方法能夠給屬性賦值,等價于直接給屬性賦值[p setValue:@"rose" forKey:@"name"];

這是常見用法;

但是,

如果私有成員變量,例如Person的.m文件中有一個_age, 該怎么賦值?

通過setValue:forKeyPath:方法。

Person *p = [[Person alloc]init];

[p setValue:@"Apple" forKeyPath:@"_age"];

假如Person中有一Dog類型的屬性myDog,Dog是一個獨立的類,Dog有個屬性名name, 該怎么賦值?

同樣通過setValue:forKeyPath:方法。

[p setValue:@"Apple" forKeyPath:@"myDog.name"];

字典轉(zhuǎn)模型,?setValuesForKeysWithDictionary:dict是關(guān)鍵

+(instancetype)videoWithDict:(NSDictionary*)dict{?

?JLVideo *videItem = [[JLVideo alloc] init];

[videItem setValuesForKeysWithDictionary:dict];returnvideItem;

}

取值, 獲取值后存于新創(chuàng)建的NSDictionary

? ? Person *p = [[Person alloc]init];

? ? p.name = @"Angel";

? ? p.age = @"12";

? ? NSDictionary *dict = [p dictionaryWithValuesForKeys:@[@"name",@"age"]];

? ? NSLog(@"%@", dict);

把多個模型Dog放入數(shù)組中,想要提取數(shù)組模型Dog的屬性name的值用于列表展示,該怎么做?

再次遍歷模型,然后把對應(yīng)的name的值存放于新數(shù)組中?

這一定是可行的,但是否過于麻煩?

能否簡便一些?

? ? Dog*d1 = [[Dogalloc]init];

? ? d1.name? =@"DoLin";

? ? Dog*d2 = [[Dogalloc]init];

? ? d2.name? =@"Apple";

? ? Dog*d3 = [[Dogalloc]init];

? ? d3.name? =@"Jucie";

? ? NSArray*arrays =@[d1,d2,d3];

? ? NSLog(@"我的數(shù)組名字結(jié)果---%@",[arrays valueForKeyPath:@"name"]);

arrays用于存放數(shù)組,當(dāng)我想提取所有模型Dog的name值,直接調(diào)用[arrays valueForKeyPath:@"name"],即可得到一個新的只有名字的數(shù)組,是不是很便利?

如果Person類有一個數(shù)組,專門用于存放Dog,?想要提取Person數(shù)組中Dog的屬性name的值用于列表展示,該怎么做?

大家首先想到的可能還是,再次遍歷模型,然后把對應(yīng)的name的值存放于新數(shù)組中?

我們換個新方式

? ? Dog *d1 = [[Dog alloc]init];

? ? d1.name? =@"DoLin";

? ? Dog*d2 = [[Dogalloc]init];

? ? d2.name? =@"Apple";

? ? Dog*d3 = [[Dogalloc]init];

? ? d3.name? =@"Jucie";

? ? Person *p = [[Person alloc]init];

? ? p.dogArrays=@[d1,d2,d3];

? ? NSLog(@"%@",[p valueForKeyPath:@"dogArrays.name"]);

講多個Dog實例存放于Person類型的dogArrays數(shù)組里,調(diào)用[p valueForKeyPath:@"dogArrays.name"]即可得到相應(yīng)的數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.給私有的成員變量賦值(當(dāng)然公有的也可以) 比如一個類有一個私有成員變量(在.m文件中),用KVC的方式然后可以...
    sunny12閱讀 447評論 0 1
  • KVC(Key-Value Coding) KVC最常見的兩個用途: 給私有的成員變量賦值(當(dāng)然公有的也可以)比如...
    ForeverYoung21閱讀 1,246評論 1 15
  • KCV 其實由于ObjC的語言特性,你根部不必進(jìn)行任何操作就可以進(jìn)行屬性的動態(tài)讀寫,這種方式就是Key Value...
    TYM閱讀 1,138評論 0 4
  • 什么是runtime? runtime 是 OC底層的一套C語言的API(引入或),編譯器最終都會將OC代碼轉(zhuǎn)化為...
    Cooper_Chp閱讀 979評論 0 0
  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,428評論 1 6

友情鏈接更多精彩內(nèi)容