iOS之KVC使用

還是老樣子,先翻譯KVC
** KVC:Key Value Coding (鍵值編碼)**


作用:

  1. KVC可以用來(lái)訪問(wèn)和設(shè)置實(shí)例變量的值( key為屬性名)
  2. KVC很暴力,可以訪問(wèn)私有屬性或者私有變量妄痪,但是這個(gè)變量必須是以 _打頭才可以(這篇文章不演示,因?yàn)椴怀S茫?/li>

還是老樣子,直接上代碼:
首先我們先創(chuàng)建一個(gè)model寡壮,這里以Student為例,在.m文件中重寫(xiě)description方法(方便調(diào)試)

#import <Foundation/Foundation.h>
@interface Student : NSObject

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

@end
#import "Student.h"

@implementation Student

- (NSString*)description {
    return [NSString stringWithFormat:@"\nname:%@\nsex:%@",self.name,self.sex];
}

@end

新建command line項(xiàng)目(也是方便調(diào)試),這篇文章主要示例Dictionary轉(zhuǎn)model

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

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSDictionary* dic = @{
                              @"name":@"爪",
                              @"sex":@"true",
                             };
        
        Student* model = [Student new];
        [model setValuesForKeysWithDictionary:dic];
        NSLog(@"%@",model);
    }
    return 0;
}

運(yùn)行看到以下結(jié)果

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

** 下面試試其他情況 **
** 情況1: **先在在Student類中新增一個(gè)age屬性

#import <Foundation/Foundation.h>
@interface Student : NSObject

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

@end

#import "Student.h"
@implementation Student

- (NSString*)description {
    return [NSString stringWithFormat:@"\nname:%@\nsex:%@\nage:%@",self.name,self.sex,self.age];
}

@end

運(yùn)行:

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

運(yùn)行是沒(méi)有問(wèn)題的讹弯,_age變量值為null

** 情況2: **字典擴(kuò)充一個(gè) @"address":@"USA"


字典擴(kuò)充

運(yùn)行:
崩潰了


運(yùn)行結(jié)果
控制臺(tái)

控制臺(tái)報(bào)的錯(cuò)也是很容易懂的况既,這里就不翻譯了,主要說(shuō)一下解決辦法

這個(gè)時(shí)候我們可以這樣解決
在Student類中增加 - (void)setValue:(id)value forUndefinedKey:(NSString *)key;

@interface Student : NSObject

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

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

@end

在.m文件中實(shí)現(xiàn)這個(gè)方法

- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    NSLog(@"沒(méi)有這個(gè)  %@   key",key);
}

自己可以運(yùn)行看結(jié)果哈组民,不會(huì)再崩潰了

** KVC 官方API **
Foundation框架下棒仍,NSKeyValueCoding

KVC 官方API

** 情況3: ** 服務(wù)器返回的json中含有id這樣的key
當(dāng)服務(wù)器放回給這樣的key的話,個(gè)人建議還是不要用臭胜,(我們項(xiàng)目中這樣用了莫其,暫時(shí)沒(méi)發(fā)現(xiàn)問(wèn)題,但是還是建議不要這樣用)因?yàn)閕d是OC的關(guān)鍵字庇楞,可以這樣改:(這邊用大寫(xiě)的ID)

@interface Student : NSObject

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

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

@end

.m文件中

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

好的設(shè)計(jì):

如果我們每個(gè)model都去- (void)setValue:(id)value forUndefinedKey:(NSString *)key; 豈不是很麻煩
這個(gè)時(shí)候我們可以創(chuàng)建一個(gè)model父類榜配,在這個(gè)父類中去處理這樣的邏輯,然后自己創(chuàng)建的model繼承父類model就ok了


希望會(huì)給大家?guī)?lái)幫助(o)/~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吕晌,一起剝皮案震驚了整個(gè)濱河市蛋褥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睛驳,老刑警劉巖烙心,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膜廊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淫茵,警方通過(guò)查閱死者的電腦和手機(jī)爪瓜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)匙瘪,“玉大人铆铆,你說(shuō)我怎么就攤上這事〉び鳎” “怎么了薄货?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)碍论。 經(jīng)常有香客問(wèn)我谅猾,道長(zhǎng),這世上最難降的妖魔是什么鳍悠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任税娜,我火速辦了婚禮,結(jié)果婚禮上藏研,老公的妹妹穿的比我還像新娘敬矩。我一直安慰自己,他們只是感情好蠢挡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布谤绳。 她就那樣靜靜地躺著,像睡著了一般袒哥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上消略,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天堡称,我揣著相機(jī)與錄音,去河邊找鬼艺演。 笑死却紧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胎撤。 我是一名探鬼主播晓殊,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伤提!你這毒婦竟也來(lái)了巫俺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肿男,失蹤者是張志新(化名)和其女友劉穎介汹,沒(méi)想到半個(gè)月后却嗡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘹承,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年窗价,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叹卷。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撼港,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骤竹,到底是詐尸還是另有隱情帝牡,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布瘤载,位于F島的核電站否灾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鸣奔。R本人自食惡果不足惜墨技,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挎狸。 院中可真熱鬧扣汪,春花似錦、人聲如沸锨匆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恐锣。三九已至茅主,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間土榴,已是汗流浹背诀姚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玷禽,地道東北人赫段。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矢赁,于是被迫代替她去往敵國(guó)和親糯笙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • KVC(Key-value coding)鍵值編碼撩银,單看這個(gè)名字可能不太好理解给涕。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    黑暗中的孤影閱讀 49,743評(píng)論 74 441
  • KVC(Key-value coding)鍵值編碼,單看這個(gè)名字可能不太好理解稠炬。其實(shí)翻譯一下就很簡(jiǎn)單了焕阿,就是指iO...
    朽木自雕也閱讀 1,562評(píng)論 6 1
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,721評(píng)論 0 9
  • KVC(Key-value coding)鍵值編碼首启,iOS的開(kāi)發(fā)中暮屡,可以允許開(kāi)發(fā)者通過(guò)Key名直接訪問(wèn)對(duì)象的屬性,...
    CALayer_Sai閱讀 2,525評(píng)論 0 4
  • 老哥
    Gaby閱讀 189評(píng)論 0 0