KVC ,NSKeyValueCoding 浅谈

首先为啥子是浅谈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
)


2.算术运算,求和 平均值 最大值 最小值

        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。。。。。 到这里了 。。 







Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值