字典转模型

如果创建了这样的一个plist。app.plist

字典转模型_第1张图片

其根为array,items为dictionary,包含string类型。

那么一开始写

1、

@property(nonatomic, strong) NSArray *apps;

- (NSArray *)apps

{

     if(_apps == nil){

    //加载数据

    //1、获取app.list文件在手机上的路径

    NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];

    //2、根据路径加载数据 plist类型是array

   _apps = [NSArray arrayWithContentsOfFile:path];

}

return _apps;

}

现在开始转模型方式

2、

可以先新建一个cocoa touch class 命名最好有个小前缀例如LWApp,继承自NSObejct

LWApp.h中有几个模型属性取决于plist中items下有几个键值 属性名和键名最好最好一样

@interface LWApp : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *icon;

此时ViewController.m中改为

- (NSArray *)apps

{

if(_apps == nil)

{

//加载数据

//1、获取app.list文件在手机上的路径

NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];

//2、根据路径加载数据 plist类型是array

NSArray *arrayDict = [NSArray arrayWithContentsOfFile:path];

//arrayDict这个数组中存的是一个个的字典

//3、创建一个可变数组用来保存一个一个的对象

NSMutableArray *arrayModels = [NSMutableArray array];  //创建了一个空的可变数组

//4、循环字典数组,把每个字典对象转换成一个模型对象

for (NSDictionary *dict in arrayDict) { //循环arrayDict把里面每个变量复制给dict

//创建一个模型

LWApp *model = [[LWApp alloc]init];

model.name = dict[@"name"];

model.icon = dict[@"icon"];

//把模型添加到arrayModel中

[arrayModels addObject:model];

}

_apps = arrayModels;  //这样_apps中就是模型对象

}

return _apps;

}

(记得载入头文件

这样写后_apps里都是模型对象啦 不是dictionary

但是这样写还是不够好。

继续改写。

3、

ViewController.m中

//4、循环字典数组,把每个字典对象转换成一个模型对象

for (NSDictionary *dict in arrayDict) { //循环arrayDict把里面每个变量复制给dict

//创建一个模型

//            LWApp *model = [[LWApp alloc]init];

//            model.name = dict[@"name"];

//            model.icon = dict[@"icon"];

LWApp *model = [LWApp appWithDict:dict];

//把模型添加到arrayModel中

[arrayModels addObject:model];

}

_apps = arrayModels;  //这样_apps中就是模型对象

LWApp.h中

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *icon;

-(instancetype) initWithDict:(NSDictionary *)dict;

+(instancetype) appWithDict:(NSDictionary *)dict;   

@end

LWApp.m中

//如果写(LWApp *)就相当于把返回值写死啦,而且如果有子类继承,会把这个方法一起继承喔,子类就不会返回子类的类型,返回的是父类的类型,所以这里我们用(instancetype) 它表示在哪个子类下就是哪个指针类型,返回哪个子类喔。

- (instancetype)initWithDict:(NSDictionary *)dict

{

if(self = [super init]){

self.name = dict[@"name"];

self.icon = dict[@"icon"];

}

return self;

}

+(instancetype)appWithDict:(NSDictionary *)dict

{

return [[self alloc] initWithDict:dict];

}

转模型时候要封装在LWApp.h中要写到 以上提及的两个方法 喔~

你可能感兴趣的:(字典转模型)