YYModel 源码解读之NSObject+YYModel.h
Posted 马在路上
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YYModel 源码解读之NSObject+YYModel.h 相关的知识,希望对你有一定的参考价值。
好了,之前的博文中详细的解释了一些辅助的类和辅助的函数,接下来就是使用它们来实现酷炫功能的时候,正所谓磨刀不误砍柴工啊
我们先把总的功能罗列出来
1. json转字典 + (NSDictionary *)_yy_dictionaryWithJSON:(id)json
2. json转模型 + (instancetype)yy_modelWithJSON:(id)json
3. 字典转模型 + (instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary
4. 模型转json - (id)yy_modelToJSONObject
5. 模型转NSData - (NSData *)yy_modelToJSONData
6. 模型转json字符串 - (NSString *)yy_modelToJSONString
7. 模型copy - (id)yy_modelCopy
8. 模型归档解档 - (id)yy_modelInitWithCoder:(NSCoder *)aDecoder / - (void)yy_modelEncodeWithCoder:(NSCoder *)aCoder
9. 模型hash值 - (NSUInteger)yy_modelHash
10. 模型是否相等 - (BOOL)yy_modelIsEqual:(id)model
11. 模型描述 - (NSString *)yy_modelDescription
功能我们已经清楚了 下边我们看看具体的实现
1.
1 /** 2 * 把id类型的数据转换成字典 3 * 4 * @param json 这个id类型为 NSDictionary / NSString / NSData 5 * 6 * @return 字典 / 可能为空 7 */ 8 + (NSDictionary *)_yy_dictionaryWithJSON:(id)json { 9 10 // 判空处理 11 if (!json || json == (id)kCFNull) return nil; 12 13 // 定义返回的数据 和把json转为NSData的临时变量 14 NSDictionary *dic = nil; 15 NSData *jsonData = nil; 16 17 // 字典 直接赋值 18 if ([json isKindOfClass:[NSDictionary class]]) { 19 dic = json; 20 21 // 字符串 转成NSData 22 } else if ([json isKindOfClass:[NSString class]]) { 23 jsonData = [(NSString *)json dataUsingEncoding : NSUTF8StringEncoding]; 24 25 // NSData 直接赋值 26 } else if ([json isKindOfClass:[NSData class]]) { 27 jsonData = json; 28 } 29 30 // 把NSData 转为 字典 31 if (jsonData) { 32 dic = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL]; 33 if (![dic isKindOfClass:[NSDictionary class]]) dic = nil; 34 } 35 return dic; 36 }
2.
1 /** 2 * json转模型 3 * 4 * @param json json 这个id类型为 NSDictionary / NSString / NSData 5 * 6 * @return 模型 / 可能为空 7 */ 8 + (instancetype)yy_modelWithJSON:(id)json { 9 10 // 先把json转为字典 11 NSDictionary *dic = [self _yy_dictionaryWithJSON:json]; 12 13 // 调用yy_modelWithDictionary函数把字典转换成模型 14 return [self yy_modelWithDictionary:dic]; 15 }
3.
1 /** 2 * 字典转模型 3 * 4 * @param dictionary 字典 5 * 6 * @return 模型 / 可能为空 7 */ 8 + (instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary { 9 10 // 判空 / 判断类型 11 if (!dictionary || dictionary == (id)kCFNull) return nil; 12 if (![dictionary isKindOfClass:[NSDictionary class]]) return nil; 13 14 // 获取自身的类型 15 Class cls = [self class]; 16 17 // 新建一个model抽象类 18 _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:cls]; 19 20 // 判断有没有自定义返回类型,有就返回自定义的类型 21 if (modelMeta->_hasCustomClassFromDictionary) { 22 cls = [cls modelCustomClassForDictionary:dictionary] ?: cls; 23 } 24 25 // 创建一个该类的实例对象 26 NSObject *one = [cls new]; 27 28 // 调用yy_modelSetWithDictionary方法给新建的对象赋值 29 if ([one yy_modelSetWithDictionary:dictionary]) return one; 30 return nil; 31 }
1 /** 2 * 辅助赋值函数 3 * 4 * @param json json 这个id类型为 NSDictionary / NSString / NSData 5 * 6 * @return 模型 / 可能为空 7 */ 8 - (BOOL)yy_modelSetWithJSON:(id)json { 9 10 // 先转字典 11 NSDictionary *dic = [NSObject _yy_dictionaryWithJSON:json]; 12 13 // 调用yy_modelSetWithDictionary函数赋值并返回对象 14 return [self yy_modelSetWithDictionary:dic]; 15 }
以上是关于YYModel 源码解读之NSObject+YYModel.h 的主要内容,如果未能解决你的问题,请参考以下文章