KVC 與 KVO 是 Objective C 的關鍵概念,個人認爲必須理解的東西,下面是實例講解。
Key-Value Coding (KVC)
KVC,即是指 Key-Value-Coding鍵值編碼,一個非正式的 Protocol,提供一種機制來間接訪問對象的屬性。KVO 就是基於 KVC 實現的關鍵技術之一。
1、間接訪問
舉個例子,一個Person類有一個內部屬性,私有聲明。
@interface Person : NSObject{
NSString *_name;
}
@end
這時候外部想要訪問person類的name屬性怎麼辦,難道再聲明一個共有的name嗎,KVO機制就爲我們提供了一個便利的方法。
Person *person = [[Person alloc]init];
[person setValue:@"王小明" forKey:@"name"];
NSLog(@"name:%@",[person valueForKey:@"name"]);
key值對應屬性名,假如我們沒有定義name這個屬性,仍然運行上面幾句代碼就會報錯如下:
提示我們爲一個沒定義的key設置value。這裏注意:區分屬性名任意字母的大小寫,例如Name還有NAME,但是不區分name和_name;
2、鍵路徑訪問屬性
每個Person類都有Card類(身份證)這個屬性,我們想通過person來訪問Card類下的no(身份證號)信息,此時我們應該怎麼做呢
新建一個Card類,.h代碼如下:
#import <Foundation/Foundation.h>
@interface Card : NSObject{
NSString *_no;
}
@end
Person類.h更改如下:
#import <Foundation/Foundation.h>
@class Card;
@interface Person : NSObject{
NSString *name;
Card *card;
}
@end
修改使用方法如下:
- (void)viewDidLoad {
[super viewDidLoad];
Person *person = [[Person alloc]init];
[person setValue:@"王小明" forKey:@"name"];
NSLog(@"name:%@",[person valueForKey:@"name"]);
Card *card = [[Card alloc]init];
[card setValue:@"31415926" forKey:@"no"];
[person setValue:card forKey:@"card"];
//通過person讀取card的no屬性
NSString *no = [person valueForKeyPath:@"card.no"];
no = [[person valueForKey:@"card"] valueForKey:@"no"];//與上句話效果相同
NSLog(@"no:%@",no);
}
結果如下:
key 與 key path 要區分開來,key 可以從一個對象中獲取值,而 key path 可以將多個 key 用點號 “.” 分割連接起來,比如:
[p valueForKeyPath:@"spouse.name"];
相當於這樣:
[[p valueForKey:@"spouse"] valueForKey:@"name"];
3、自動轉換基本數據類型
我們現在爲Person類添加一個int型成員變量age(年齡):
NSInteger _age;//int類型
我們存取改成員變量:
[person setValue:@"88" forKeyPath:@"age"];//注意成員變量設置的是int型這裏存進去的是string型
NSLog(@"age:%@",[person valueForKeyPath:@"age"]);//讀取的也是string
結果如下:
可以看到我們沒做任何類型轉換的前提下,結果正常打印 注意:keyPath可以代替Key來取值,但是Key不能代替keyPath.
4、對集合進行操作(如NSArray)利用KVC是可以對集合進行操作的,我們爲Person添加一個集合對象如下:
NSArray *_aryAllPerson;//person組合
往裏面添加三個有年齡的person類然後操作如下:
//創建數組
NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:3];
for (int i = 0; i < 3; i++) {
Person *person = [[Person alloc]init];
[person setValue:[NSString stringWithFormat:@"%d",10*i + 30] forKey:@"age"];
[array addObject:person];
}
//操作集合對象
[person setValue:array forKey:@"aryAllPerson"];
NSLog(@"各人的年齡:%@",[person valueForKeyPath:@"aryAllPerson.age"]);
NSLog(@"總共%@各人",[person valueForKeyPath:@"aryAllPerson.@count"]);
NSLog(@"最高成績:%@", [person valueForKeyPath:@"[email protected]"]);
NSLog(@"最低成績:%@", [person valueForKeyPath:@"[email protected]"]);
NSLog(@"平均成績:%@", [person valueForKeyPath:@"[email protected]"]);
可以添加可變數組也可以添加不可變數組,打印結果如下:
到此爲止KVC相關語法介紹完畢,希望對大家有所幫助,下面我們來看看KVO
Key-Value Observing (KVO)
實際上是一種鍵值觀察機制,比如我們可以爲view添加一個觀察者觀察他所有屬性