首先爲啥子是淺談KVC,不得不說iOS API太豐富而且又不開源,你想深談都難!
引入概念,啥子是 KVC ? 我們先不聊神馬是KVC,我們拿一段簡短代碼開刀
NSDictionary *dd = @{@"name":@{@"first":@{@"second":@"Jin San Pang"}}};
我們聲明瞭一個字典,我想取到裏面的 值,Jin San Pang
這個應該是相當基礎和簡單的
NSString *jsp = dd[@"name"][@"first"][@"second"];
我們像這樣逐層解析是可以得到 Jin San Pang 這個值的 ,但是我們還可以用到另外一種辦法,如下
NSDictionary *dd = @{@"name":@{@"first":@{@"second":@"Jin San Pang"}}};
NSLog(@"%@",[dd valueForKeyPath:@"name.first.second"]);
我們通過一個相對簡單的 點點點 獲取了Jin San Pang 的值 ,這個代碼有點像keyValue取值,但是它卻支持點點點,點開API一看,發現這個貨居然是NSObject的擴展
既然有get 那麼肯定有set .....然而
NSDictionary *dd = @{@"name":@{@"first":@{@"second":@"Jin San Pang"}}};
NSLog(@"%@",[dd valueForKeyPath:@"name.first.second"]);
[dd setValue:@"Jin z e" forKeyPath:@"name.first.second"];
NSLog(@"%@",dd);
這張圖就說明問題了,報錯,其實我們可以想象到爲神馬出錯了 。。。。 我們使用的是不可變字典
那麼直覺告訴我們,如果是使用可變字典的話應該可以了。。
NSMutableDictionary *dic1 = [[NSMutableDictionary alloc] init];
[dic1 setObject:@"Jin San Pang" forKey:@"second"];
NSMutableDictionary *dic2 = [[NSMutableDictionary alloc] init];
[dic2 setObject:dic1 forKey:@"first"];
NSMutableDictionary *dic3 = [[NSMutableDictionary alloc] init];
[dic3 setObject:dic2 forKey:@"name"];
NSLog(@"%@",dic3);
[dic3 setValue:@"Jin z e" forKeyPath:@"name.first.second"];
NSLog(@"%@",dic3);
剛剛上面提到valueForKeyPath是對NSObject類的擴展,那麼只要繼承了 NSObject類應該都能使用這個方法,我們通過面向對象的方式來搞一搞 ,先搞一個車類
@interface Car : NSObject
@property (strong,nonatomic) NSString *cName;
@property (strong,nonatomic) NSString *cColor;
@end
再來搞一個人的類
@class Car;
@interface Person : NSObject
@property (strong,nonatomic) Car *car;
@property (strong,nonatomic) NSString *name;
@end
人開車, 先開BMW然後開 五菱宏光,上代碼
Car *c = [[Car alloc] init];
c.cColor = @"red";
[c setCName:@"BMW"];
Person *p = [[Person alloc] init];
[p setName:@"zhangsan"];
[p setCar:c];
NSLog(@"%@", [p valueForKeyPath:@"car.cName"]);
[p setValue:@"五菱宏光" forKeyPath:@"car.cName"];
NSLog(@"%@", p);
很明顯,BMW變成了五菱宏光了 ,也就是 。。。論證了上面的
然後上面的可能用的比較多,下面幾個方法可能比較少
1.變大寫,求長度
NSArray *array1 = @[@"金三胖", @"王二麻子", @"zhangsan", @"lisi"];
NSLog(@"array1 = %@", [array1 valueForKeyPath:@"uppercaseString"]);
NSLog(@"array1 = %@", [array1 valueForKeyPath:@"length"]);
2017-08-10 19:47:01.772799+0800 http_proxy_example[16661:7720873] array1 = (
"\U91d1\U4e09\U80d6",
"\U738b\U4e8c\U9ebb\U5b50",
ZHANGSAN,
LISI
)
2017-08-10 19:47:01.773183+0800 http_proxy_example[16661:7720873] array1 = (
3,
4,
8,
4
)
NSArray *array2 = @[@10, @20, @30, @40, @50];
NSNumber *sum = [array2 valueForKeyPath:@"@sum.self"];
NSNumber *avg = [array2 valueForKeyPath:@"@avg.self"];
NSNumber *max = [array2 valueForKeyPath:@"@max.self"];
NSNumber *min = [array2 valueForKeyPath:@"@min.self"];
NSLog(@"array2 = %@ %@ %@ %@",sum,avg,max,min);
2017-08-10 19:51:07.017870+0800 http_proxy_example[16759:7745552] array2 = 150 30 50 10
Program ended with exit code: 0
3.去重複
NSArray *array3 = @[@"JinYiPang", @"JinErPang", @"JinSanPang", @"JinYiPang", @"JinErPang",@"JinZhengEn"];
NSLog(@"array3 = %@", [array3 valueForKeyPath:@"@distinctUnionOfObjects.self"]);
NSArray *array4 = @[@{@"name" : @"JinYiPang",
@"code" : @"123"},
@{@"name": @"JinSanPang",
@"code" : @"90"},
@{@"name": @"JinErPang",
@"code" : @"80"},
@{@"name": @"JinSanPang",
@"code" : @"100"}];
NSLog(@"array4 = %@", [array4 valueForKeyPath:@"name"]);
NSLog(@"array4 = %@", [array4 valueForKeyPath:@"@distinctUnionOfObjects.name"]);
NSArray *temp1 = @[@111, @222, @333, @444];
NSArray *temp2 = @[@333, @444, @555];
NSLog(@"temp \n%@",[@[temp1, temp2] valueForKeyPath:@"@distinctUnionOfArrays.self"]);
NSLog(@"temp \n%@",[@[temp1, temp2] valueForKeyPath:@"@unionOfArrays.self"]);
OK。。。。。 到這裏了 。。