字典的快速賦值 setValuesForKeysWithDictionary

前言

在學(xué)習(xí)解析數(shù)據(jù)的時(shí)候,我們經(jīng)常是這么寫(xiě)的:

PersonModel.h文件中

@property(nonatomic,copy)NSString*name;@property(nonatomic,copy)NSString*sex;@property(nonatomic,copy)NSString*age;

字典:

NSDictionary*dic = @{@"name":@"張三",@"sex":@"男",@"age":@"22"};

賦值:

PersonModel *test=[[PersonModel alloc]init];? ? ? ? test.name=dic[@"name"];? ? ? ? test.sex=dic[@"sex"];? ? ? ? test.age=dic[@"age"];

輸出:

NSLog(@"test.name=%@",test.name);NSLog(@"test.sex=%@",test.sex);NSLog(@"test.age=%@",test.age);

輸出結(jié)果:

2015-10-19 13:31:25.478

setValuesForKeysWithDictionary[9676:913009] test.name=張三

2015-10-19 13:31:25.478

setValuesForKeysWithDictionary[9676:913009] test.sex=男

2015-10-19 13:31:25.478

setValuesForKeysWithDictionary[9676:913009] test.age=22

看上去很有條理,按部就班榨崩,但是一旦數(shù)據(jù)多了起來(lái)歼捐,卻會(huì)非常繁瑣因悲,所以這次我會(huì)介紹一個(gè)相對(duì)輕松的方法setValuesForKeysWithDictionary嘶居。

簡(jiǎn)單使用

如果用setValuesForKeysWithDictionary這個(gè)方法會(huì)怎樣?

將賦值過(guò)程

test.name=dic[@"name"];? ? test.sex=dic[@"sex"];? ? test.age=dic[@"age"];

替換為一句話

[testsetValuesForKeysWithDictionary:dic];

輸出結(jié)果一模一樣,是不是簡(jiǎn)單又方便躁劣?

深入的問(wèn)題

如果model里面的有不存在于dic中的元素會(huì)怎樣?

在Model文件中添加一行

@property(nonatomic,copy)NSString*other;

并輸出得時(shí)候輸出

NSLog(@"test.other=%@",test.other);

輸出結(jié)果:

2015-10-19 13:49:25.955

setValuesForKeysWithDictionary[9964:928391] test.name=張三

2015-10-19 13:49:25.956

setValuesForKeysWithDictionary[9964:928391] test.sex=男

2015-10-19 13:49:25.956

setValuesForKeysWithDictionary[9964:928391] test.age=22

2015-10-19 13:49:25.956

setValuesForKeysWithDictionary[9964:928391] test.other=(null)

顯而易見(jiàn),dic中得值可以完全賦值給model库菲,而other沒(méi)有被賦值账忘,所以值是空的。

2.如果dic里面的有不存在于model中的元素會(huì)怎樣熙宇?

在Model文件中刪除一行

@property(nonatomic,copy)NSString* age;

在刪除對(duì)應(yīng)得輸出后運(yùn)行鳖擒。

糟了!通過(guò)了編譯烫止,但是運(yùn)行時(shí)報(bào)錯(cuò)!

Terminating app due to uncaught exception 'NSUnknownKeyException',

reason: '[ setValue:forUndefinedKey:]:

this class is not key value coding-compliant for the key age.'

因?yàn)樵趍odel中蒋荚,沒(méi)有對(duì)應(yīng)的age屬性,所以導(dǎo)致了程序崩潰馆蠕。

解決方式就是實(shí)現(xiàn)一個(gè)方法setValue:forUndefinedKey: 這個(gè)方法能過(guò)濾掉不存在的鍵值期升。

在model中添加。

h文件中添加:

-(void)setValue:(id)value forUndefinedKey:(NSString*)key;

并需要在m文件中實(shí)現(xiàn):

-(void)setValue:(id)value forUndefinedKey:(NSString*)key{? ? ? ? }

對(duì)互躬,并不需要在方法中寫(xiě)任何內(nèi)容播赁。

現(xiàn)在來(lái)運(yùn)行一下。

輸出結(jié)果:

2015-10-19 13:55:55.390

setValuesForKeysWithDictionary[10082:937173] test.name=張三

2015-10-19 13:55:55.391

setValuesForKeysWithDictionary[10082:937173] test.sex=男

成功運(yùn)行吼渡!

3.如果dic中的key與model中的變量名字不同容为,應(yīng)該怎么賦值?

從前面我們可以知道寺酪,dic中key賦值給model中與key同名的屬性坎背。

那么如果dic中得key值為 username,model中的名字為name寄雀,又或是dic中的key值為ID,INT 等關(guān)鍵字得滤,應(yīng)該怎么變化。

答案也是從setValue:forUndefinedKey方法入手盒犹。

首先我們把dic的值改變:

NSDictionary*dic = @{@"username":@"張三",@"sex":@"男",@"id":@"22"};

model中的屬性:

@property(nonatomic,copy)NSString*name;@property(nonatomic,copy)NSString*sex;@property(nonatomic,copy)NSString* age;

完善model中的setValue:forUndefinedKey方法

-(void)setValue:(id)value forUndefinedKey:(NSString*)key{if([key isEqualToString:@"id"])? ? ? ? {self.age=value;? ? ? ? }if([key isEqualToString:@"username"])? ? ? ? {self.name=value;? ? ? ? }? ? }

運(yùn)行后結(jié)果:

? ? 2015-10-19 14:30:11.241

? ? setValuesForKeysWithDictionary[10289:956012] test.name=張三

? ? 2015-10-19 14:30:11.242

? ? setValuesForKeysWithDictionary[10289:956012] test.sex=男

? ? 2015-10-19 14:30:11.242

? ? setValuesForKeysWithDictionary[10289:956012] test.age=22

正常輸出耿戚!

作者:嘻嘻zhy

鏈接:http://www.reibang.com/p/870eb4b4170a

來(lái)源:簡(jiǎn)書(shū)

簡(jiǎn)書(shū)著作權(quán)歸作者所有湿故,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膜蛔,一起剝皮案震驚了整個(gè)濱河市坛猪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌皂股,老刑警劉巖墅茉,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異呜呐,居然都是意外死亡就斤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蘑辑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)洋机,“玉大人,你說(shuō)我怎么就攤上這事洋魂”疗欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵副砍,是天一觀的道長(zhǎng)衔肢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)豁翎,這世上最難降的妖魔是什么角骤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮心剥,結(jié)果婚禮上邦尊,老公的妹妹穿的比我還像新娘。我一直安慰自己优烧,他們只是感情好胳赌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著匙隔,像睡著了一般疑苫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纷责,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天捍掺,我揣著相機(jī)與錄音,去河邊找鬼再膳。 笑死挺勿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喂柒。 我是一名探鬼主播不瓶,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼禾嫉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蚊丐?” 一聲冷哼從身側(cè)響起熙参,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎麦备,沒(méi)想到半個(gè)月后孽椰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凛篙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年黍匾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呛梆。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锐涯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出填物,到底是詐尸還是另有隱情纹腌,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布融痛,位于F島的核電站,受9級(jí)特大地震影響神僵,放射性物質(zhì)發(fā)生泄漏雁刷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一保礼、第九天 我趴在偏房一處隱蔽的房頂上張望沛励。 院中可真熱鬧,春花似錦炮障、人聲如沸目派。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)企蹭。三九已至,卻和暖如春智末,著一層夾襖步出監(jiān)牢的瞬間谅摄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工系馆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留送漠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓由蘑,卻偏偏與公主長(zhǎng)得像闽寡,于是被迫代替她去往敵國(guó)和親代兵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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