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 的主要内容,如果未能解决你的问题,请参考以下文章

YYModel 源码解读之NSObject+YYModel.h

YYModel 源码解读之YYModel.h

YYModel 源码解读之YYClassInfo.h

YYModel 源码解读之YYClassInfo.h

YYModel 源码解读之YYClassInfo.h

iOS YYModel使用详解