字典转模型
字典转化成模型
字典:用来存储数据,用键值对来存储数据,是NSDictionary类型(坏处:容易写错,不容易调试)
模型:用来存储数据,用属性来存储数据,好处:(有提示,不容易写错)
字典转化成模型:一个字典转换成一个模型,把字典的键值对转换的模型的属性
模型的建立:模型是一个纯洁的object对象,里面放着是属性,属性的类型和名称有字典中的键值对的key确定,value值类型是什么类型模型中属性就是什么类型,key值的名字是什么模型的的名字就是什么
转化过程:把字典中的键值对中的value值赋值给模型中的属性
通过用for循环遍历字典数组,把每一个字典中的键值对转换成模型的属性。
模型中 * 提供方发用来字典转化模型 */ - (instancetype)initWithDict:(NSDictionary *)dict; + (instancetype)questionWithDict:(NSDictionary *)dict;
- (instancetype)initWithDict:(NSDictionary *)dict{ // kvc:通过forKeyPath这个参数的key值找到对象(self)对应属性,然后用对应的value值给他赋值,前提必须用属性值和key一样 if (self = [super init]) { // self.answer = dict[@"answer"]; // self.title = dict[@"title"]; // self.icon = dict[@"icon"]; // self.options = dict[@"options"]; // // [self setValue:dict[@"title"] forKeyPath:@"title"]; // [self setValue:dict[@"icon"] forKeyPath:@"icon"]; // [self setValue:dict[@"answer"] forKeyPath:@"answer"]; // [self setValue:dict[@"options"] forKeyPath:@"options"]; [self setValuesForKeysWithDictionary:dict]; } return self; } + (instancetype)questionWithDict:(NSDictionary *)dict{ return [[self alloc]initWithDict:dict]; }
- (NSArray *)questions{ if (_questions == nil) { // 1.获取全路径 NSString *path =[[NSBundle mainBundle]pathForResource:@"questions.plist" ofType:nil]; // 2.读取plist文件 NSArray *dictArray = [NSArray arrayWithContentsOfFile:path]; // 3.字典转模型 NSMutableArray *tempArray = [NSMutableArray array]; for (NSDictionary *dict in dictArray) { QuestionModel *questionModel = [QuestionModel questionWithDict:dict]; [tempArray addObject:questionModel]; } _questions = tempArray; } return _questions; }
为什么要把字典转成模型?
* 字典缺陷:
0> 写代码的时候字典的键没有智能提示, 但是模型的属性可以有智能提示
1> "键"是字符串, 如果写错了, 编译器不报错(在编译的时候不报错), 运行时可能出错, 出错了很难找错。
2> 使用"模型"可以更方便的使用面向对象的3大特(封装、继承、多态)性进行扩展。
* 什么是模型?
"模型"就是自定义的类, 通过为"类"增加各种属性来保存数据。
字典转模型要修改哪里的代码?
1> 创建一个模型类
2> 在懒加载数据的时候, 把加载到的数据都放到模型对象中, 然后再把模型对象放到数组中。
把字典转模型的过程封装到"模型"内部
* 原因: 将来的这个"模型"可能会在很多地方被用到(比如有很多个控制器都会使用这个模型), 那么每次用到模型的地方都需要写一次把字典中的数据赋给模型属性的代码, 此时如果把这些赋值语句封装到模型内部, 会大大简化了使用复杂度与代码量。
* 思路:
1> 在模型中接收一个NSDictionary的参数, 然后在模型内部把NSDictioanry中的键值对数据赋值给模型的属性。
2> 封装一个initWithDict方法和一个appWithDict方法(规范)
id与instancetype的介绍
1. 使用id作为方法返回值的问题:
1> 在接收方法的返回值的时候可以使用任何类型来接收, 编译都不报错, 但是运行时可能出错。
2. instancetype需要注意的点
1> instancetype在类型表示上, 与id意思一样, 都表示任何对象类型
2> instancetype只能用作返回值类型, 不能向id一样声明变量、用作参数等
3> 使用instancetype, 编译器会检测instancetype的真实类型, 如果类型不匹配, 编译时就报错了。(instancetype出现在哪个类型中就表示对应的类型)