字典轉(zhuǎn)模型
- 1.簡(jiǎn)單的字典轉(zhuǎn)模型
-(instancetype)initWithDict:(NSDictionary *)dict
{
if (self=[super init]) {
self.name=dict[@"name"];
self.icon=dict[@"icon"];
//簡(jiǎn)單的字典轉(zhuǎn)模型可以直接采用KVC來轉(zhuǎn)
// [self setValuesForKeysWithDictionary:dict];
}
return self;
}
+(instancetype)carsWithDict:(NSDictionary *)dict
{
return [[self alloc]initWithDict:dict];
}
- 2.字典中包含數(shù)組
2.1首先在頭文件創(chuàng)建一個(gè)數(shù)組包含子模型
2.2在.m文件中將字典模型轉(zhuǎn)為車模型后存放入車模型數(shù)組中
/*分組 */
@interface AZCarGroup : NSObject
/*車模型數(shù)組 */
@property(nonatomic,strong)NSArray *cars;
/*組名*/
@property(nonatomic,copy)NSString *title;
-(instancetype)initWithDict:(NSDictionary *)dict;
+(instancetype)carGroupWithDict:(NSDictionary *)dict;
-(instancetype)initWithDict:(NSDictionary *)dicts
{
if (self=[super init]) {
self.title=dicts[@"title"];
//將字典數(shù)組中的字典轉(zhuǎn)為車模型存放到頭文件的數(shù)組中
NSMutableArray *cars=[NSMutableArray array];
for (NSDictionary *dict in dicts[@"cars"]) {
AZCar *car=[AZCar carsWithDict:dict];
[cars addObject:car];
}
self.cars=cars;
}
return self;
}
+(instancetype)carGroupWithDict:(NSDictionary *)dicts
{
return [[self alloc]initWithDict:dicts];
}
- 一般在使用我們的模型數(shù)據(jù)時(shí)采用懶加載方式加載
//所有車數(shù)據(jù)
-(NSArray *)carGroups
{
if (_carGroups==nil) {
//加載plist數(shù)據(jù)
NSArray *dictArr=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"cars.plist" ofType:nil]];
//字典轉(zhuǎn)模型
NSMutableArray *tempArray=[NSMutableArray array];
for (NSDictionary *dict in dictArr) {
AZCarGroup *carGroup=[AZCarGroup carGroupWithDict:dict];
[tempArray addObject:carGroup];
}
self.carGroups=tempArray;
}
return _carGroups;
}
-
3.MJExtension框架的使用
首先導(dǎo)入框架
確定Cars里面裝的AZCar模型
將模型裝入數(shù)組
框架的使用簡(jiǎn)化了復(fù)雜機(jī)械的字典轉(zhuǎn)模型操作
#import "MJExtension.h"
//所有車數(shù)據(jù)
-(NSArray *)carGroups
{
if (_carGroups==nil) {
//通過返回的字典確定cars數(shù)組中所裝的內(nèi)容為AZCar模型
[AZCarGroup mj_setupObjectClassInArray:^NSDictionary *{
return @{@"cars":[AZCar class]};
}];
_carGroups=[AZCarGroup mj_objectArrayWithFilename:@"cars.plist"];
}
return _carGroups;
}
- 4.修改模型屬性類型
/**
[item setValue:@"中國" forKeyPath:@"name"];
setValue:forKeyPath實(shí)現(xiàn)原理
1.先查看有沒有對(duì)應(yīng)key值的set方法,如果有set方法,就會(huì)調(diào)用set方法,給對(duì)應(yīng)的屬性賦值
2.如果沒有set方法,去查看有沒有跟key值相同并且?guī)в邢聞澗€的成員屬性.如果有的話,就給帶有下劃線的成員屬性賦值
3.如果沒有跟key值相同并且?guī)в邢聞澗€的成員屬性,還會(huì)去找有沒有跟key值相同名稱的成員屬性.如果有,就給它賦值.
4.如果沒有直接報(bào)錯(cuò).
*/```
//setValuesForKeysWithDictionary實(shí)現(xiàn)原理
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[item setValue:obj forKeyPath:key];
NSLog(@"%@--%@",key,obj);
}];
return item;
}
// 可以在set方法賦值前修改該屬性類型(運(yùn)行時(shí))
-(void)setIcon:(UIImage *)icon{
NSString *imageName = (NSString *)icon;
_icon = [UIImage imageNamed:imageName];
}
-(void)setIcon:(NSString *)icon{
// NSString *imageName = (NSString *)icon;
_icon = [UIImage imageNamed:icon];
}