首先为啥子是浅谈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。。。。。 到这里了 。。