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。。。。。 到這裏了 。。 







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章