神奇的valueForKeyPath

以前一直沒有用到過valueForKeyPath,一直以為和valueForKey差不多,可是今天一看才嚇了一跳,功能好強大啊.


objectForKey/valueForKey/valueForKeyPath區(qū)分

objectForKey是NSDictionary的一個方法,用來通過key取得字典的值.只有字典可以調(diào)用這個方法
valueForKeyvalueForKeyPath是兩個KVC方法,所有的對象都可以調(diào)用, valueForKey可以通過屬性名獲取到這個屬性的值,而valueForKeyPath則可以實現(xiàn)多級取值.

功能一

對于@[@{key:value},@{key:value},@{key:value}]的數(shù)組(數(shù)組元素是字典的),通過同一個key可以取到value的集合(數(shù)組)

    NSDictionary *dic1 = @{@"city":@"北京",@"count":@"22"};
    NSDictionary *dic2 = @{@"city":@"上海",@"count":@"18"};
    NSDictionary *dic3 = @{@"city":@"深圳",@"count":@"17"};
    
    NSArray *arr = @[dic1,dic2,dic3];
    
    NSLog(@"city:%@",[arr valueForKeyPath:@"city"]);
    NSLog(@"count:%@",[arr valueForKeyPath:@"count"]);

輸出結(jié)果:

2016-08-03 15:07:05.276 ValueForKeyPath使用[5181:192059] city:(
    "北京",
    "上海",
    "深圳"
)
2016-08-03 15:07:05.276 ValueForKeyPath使用[5181:192059] count:(
    22,
    22,
    18,
    17
)

功能二

針對功能一,還有增強版,可以計算平均值/求和等操作

    NSLog(@"求和:%@",[arr valueForKeyPath:@"@sum.count"]);
    NSLog(@"平均:%@",[arr valueForKeyPath:@"@avg.count"]);
    NSLog(@"最大:%@",[arr valueForKeyPath:@"@max.count"]);
    NSLog(@"最小:%@",[arr valueForKeyPath:@"@min.count"]);

輸出結(jié)果

2016-08-03 15:07:05.277 ValueForKeyPath使用[5181:192059] 求和:79
2016-08-03 15:07:05.278 ValueForKeyPath使用[5181:192059] 平均:19.75
2016-08-03 15:07:05.278 ValueForKeyPath使用[5181:192059] 最大:22
2016-08-03 15:07:05.278 ValueForKeyPath使用[5181:192059] 最小:17

功能三

對于@{key1:@{key2:vale}}的字典(字典的value是另一個字典),通過key1.key2的鏈式的方式得到最深層的字典的值

    NSDictionary *dict4 = @{@"name":@"小明",@"age":@"22"};
    NSDictionary *dict5 = @{@"student":dict4};
    NSDictionary *dict6 = @{@"class":dict5};
    NSDictionary *dict7 = @{@"school":dict6};
    
    NSLog(@"%@",[dict7 valueForKeyPath:@"school.class.student.name"]);
    NSLog(@"%@",[dict7 valueForKeyPath:@"school.class.student.age"]);

輸出結(jié)果

2016-08-03 15:07:05.278 ValueForKeyPath使用[5181:192059] 小明
2016-08-03 15:07:05.279 ValueForKeyPath使用[5181:192059] 22

功能四

針對于功能三,不只是字典套字典,對象套對象/對象套對象再套字典等情況,都可以通過鏈式調(diào)用到深層的值

    Student *student1 = [[Student alloc] init];
    student1.name = @"小紅";
    student1.info = @{@"phone":@"13102212345",@"mail":@"xiaohong@qq.com"};
    
    School *school = [[School alloc] init];
    school.student = student1;
    
    NSLog(@"%@",[school valueForKeyPath:@"student.name"]);
    NSLog(@"%@",[school valueForKeyPath:@"student.info.phone"]);

輸出結(jié)果

2016-08-03 15:21:38.258 ValueForKeyPath使用[5261:202278] 小紅
2016-08-03 15:21:38.258 ValueForKeyPath使用[5261:202278] 13102212345
2016-08-03 15:21:38.259 ValueForKeyPath使用[5261:202278] xiaohong@qq.com
Demo代碼

ViewController.m

#import "ViewController.h"
#import "Student.h"
#import "School.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSDictionary *dic1 = @{@"city":@"北京",@"count":@"22"};
    NSDictionary *dic2 = @{@"city":@"上海",@"count":@"18"};
    NSDictionary *dic3 = @{@"city":@"深圳",@"count":@"17"};
    
    NSArray *arr = @[dic1,dic2,dic3];
    
    NSLog(@"city:%@",[arr valueForKeyPath:@"city"]);
    NSLog(@"count:%@",[arr valueForKeyPath:@"count"]);
    NSLog(@"求和:%@",[arr valueForKeyPath:@"@sum.count"]);
    NSLog(@"平均:%@",[arr valueForKeyPath:@"@avg.count"]);
    NSLog(@"最大:%@",[arr valueForKeyPath:@"@max.count"]);
    NSLog(@"最小:%@",[arr valueForKeyPath:@"@min.count"]);
    
    NSDictionary *dict4 = @{@"name":@"小明",@"age":@"22"};
    NSDictionary *dict5 = @{@"student":dict4};
    NSDictionary *dict6 = @{@"class":dict5};
    NSDictionary *dict7 = @{@"school":dict6};
    
    NSLog(@"%@",[dict7 valueForKeyPath:@"school.class.student.name"]);
    NSLog(@"%@",[dict7 valueForKeyPath:@"school.class.student.age"]);
    
    Student *student1 = [[Student alloc] init];
    student1.name = @"小紅";
    student1.info = @{@"phone":@"13102212345",@"mail":@"xiaohong@qq.com"};
    
    School *school = [[School alloc] init];
    school.student = student1;
    
    NSLog(@"%@",[school valueForKeyPath:@"student.name"]);
    NSLog(@"%@",[school valueForKeyPath:@"student.info.phone"]);
    NSLog(@"%@",[school valueForKeyPath:@"student.info.mail"]);
}
@end

Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject
@property(nonatomic,strong) NSDictionary *info;
@property(nonatomic,strong) NSString *name;
@end

School.h

#import <Foundation/Foundation.h>
#import "Student.h"

@interface School : NSObject
@property(nonatomic,strong) Student *student;
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脓斩,一起剝皮案震驚了整個濱河市木西,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌随静,老刑警劉巖八千,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異燎猛,居然都是意外死亡恋捆,警方通過查閱死者的電腦和手機立镶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門苛吱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卤恳,“玉大人灾锯,你說我怎么就攤上這事绰垂【⒆埃” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵占业,是天一觀的道長谦疾。 經(jīng)常有香客問我犬金,道長,這世上最難降的妖魔是什么晚顷? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任瞳氓,我火速辦了婚禮栓袖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裹刮。我一直安慰自己,他們只是感情好囊咏,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布梅割。 她就那樣靜靜地躺著葛家,像睡著了一般。 火紅的嫁衣襯著肌膚如雪癞谒。 梳的紋絲不亂的頭發(fā)上刃榨,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天枢希,我揣著相機與錄音朱沃,去河邊找鬼。 笑死搬卒,一個胖子當著我的面吹牛契邀,可吹牛的內(nèi)容都是我干的失暴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼田盈,長吁一口氣:“原來是場噩夢啊……” “哼缴阎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起述暂,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤建炫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后艺配,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體转唉,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赠法,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年乔夯,在試婚紗的時候發(fā)現(xiàn)自己被綠了款侵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片新锈。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡茂蚓,死狀恐怖剃幌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牍白,我是刑警寧澤抖棘,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站切省,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏般渡。R本人自食惡果不足惜芙盘,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一儒老、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧薇正,春花似錦囚衔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榆苞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坐漏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工街夭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留板丽,地道東北人趁尼。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓酥泞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親似炎。 傳聞我的和親對象是個殘疾皇子凡人,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • KVC(Key-value coding)鍵值編碼挠轴,單看這個名字可能不太好理解。其實翻譯一下就很簡單了欧啤,就是指iO...
    朽木自雕也閱讀 1,552評論 6 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理邢隧,服務(wù)發(fā)現(xiàn)冈在,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • 1炫贤、memcache的概念付秕? Memcache是一個高性能的分布式的內(nèi)存對象緩存系統(tǒng),通過在內(nèi)存里維護一個統(tǒng)一的巨...
    桖辶殤閱讀 2,230評論 2 12
  • 1. redis的五大數(shù)據(jù)類型 String(字符串): String 是redis最基本的數(shù)據(jù)類型,一個key對...
    AD甜蜜蜜閱讀 1,276評論 0 2