還是老樣子,先翻譯KVC
** KVC:Key Value Coding (鍵值編碼)**
作用:
- KVC可以用來(lái)訪問(wèn)和設(shè)置實(shí)例變量的值( key為屬性名)
- 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é)果
** 下面試試其他情況 **
** 情況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)行是沒(méi)有問(wèn)題的讹弯,_age變量值為null
** 情況2: **字典擴(kuò)充一個(gè) @"address":@"USA"
運(yùn)行:
崩潰了
控制臺(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
** 情況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)/~