YYModel 源码解读(二)之NSObject+YYModel.h (5)

好了,之前的博文中详细的解释了一些辅助的类和辅助的函数,接下来就是使用它们来实现酷炫功能的时候,正所谓磨刀不误砍柴工啊

我们先把总的功能罗列出来

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 }
时间: 2024-08-08 04:29:08

YYModel 源码解读(二)之NSObject+YYModel.h (5)的相关文章

YYModel 源码解读(二)之NSObject+YYModel.h (1)

本篇文章主要介绍 _YYModelPropertyMeta 前边的内容 首先先解释一下前边的辅助函数和枚举变量,在写一个功能的时候,这些辅助的东西可能不是一开始就能想出来的,应该是在后续的编码过程中 逐步添加的. #define force_inline __inline__ __attribute__((always_inline)) 这行代码用到了C语言的内联函数 内联函数: 是用inline修饰的函数,内联函数在代码层次看和普通的函数结构一样,却不具备函数的性质,内联函数不是在调用时发生控

(转)go语言nsq源码解读二 nsqlookupd、nsqd与nsqadmin

转自:http://www.baiyuxiong.com/?p=886 ----------------------------------------------------------------------- 上一篇go语言nsq源码解读-基本介绍  介绍了最基本的nsq环境搭建及使用.在最后使用时,我们用到了几个命令:nsqlookupd.nsqd.nsqadmin.curl及 nsq_to_file,并看到用curl命令写入的几个”hello world”被nsq_to_file命令保

YYModel 源码解读(二)之YYClassInfo.h (3)

前边3篇介绍了YYClassinfo 文件的组成单元,算是功能的分割,按照业务的设计思想来说,方向应该是相反的 由此引申出我们在设计api的思想其实和项目管理是很类似的----- 一些题外话 1.目的 回到代码,首先应该明确写这个类的目的是什么? 按照正常逻辑,我们需要一个类来获取我们所需要的所有和此类相关的信息 包括(类名,父类,成员变量,方法,属性...) 2.技术调研 调研我们所需要的结果是否能够通过技术手段实现 3.目标分隔,也就是任务分解 需要把整体目标分解成小目标,在本代码中则分割成

YYModel 源码解读 总结

在使用swfit写代码的过程中,使用了下oc写的字典转模型,发现有些属性转不成功,就萌生了阅读源码的想法. 其实一直都知道Runtime机制,但并没有系统的学习,可能是因为平时的使用比较少,无意间在github上看到了YYModel ,粗略的看了下源码,发现有大量的c方面的知识,就产生了很大的兴趣,因为c总是性能的代名词吗?于是就有了这几篇文章,其实主要的目的还是对平时所学知识的一个总结. 毕竟,人类的记忆总是容易忘记的. 不知道作者在写这个框架时的思想是怎么样一个过程?但字里行间都流露出对代码

YYModel 源码解读之YYModel.h (一)

#if __has_include(<YYModel/YYModel.h>) FOUNDATION_EXPORT double YYModelVersionNumber; FOUNDATION_EXPORT const unsigned char YYModelVersionString[]; #import <YYModel/NSObject+YYModel.h> #import <YYModel/YYClassInfo.h> #else #import "

YYModel 源码解读(二)之NSObject+YYModel.h (4)

接下来我们继续向下看 typedef struct { void *modelMeta; ///< _YYModelMeta void *model; ///< id (self) void *dictionary; ///< NSDictionary (json) } ModelSetContext; 这是一个c的结构体,在c中 void * 相当于 oc 中的 id 类型 那么 为什么使用c的结构体呢,最主要的使用场景就是我们需要同时使用多个参数的情况下,可以使用c的结构体 /**

YYModel 源码解读(二)之NSObject+YYModel.h (3)

本篇主要介绍的是 在真正转之前的几个辅助函数 /** Get number from property. @discussion Caller should hold strong reference to the parameters before this function returns. @param model Should not be nil. @param meta Should not be nil, meta.isCNumber should be YES, meta.get

YYModel 源码解读(二)之YYClassInfo.h (1)

1 NS_ASSUME_NONNULL_BEGIN 2 NS_ASSUME_NONNULL_END 为了兼容Swift 中的 ? 和 ! oc 在6.3引入了两个新的类型注释:__nullable和__nonnull , 在字面上很好理解 可能为空, 不为空, 在上面代码中间则表示 默认的所有的属性都不能为空,这样我们在敲码的过程中只需要手写__nullable的类型就可以了  1 /** 2 Type encoding's type. 3 */ 4 typedef NS_OPTIONS(NSU

YYModel 源码解读(二)之YYClassInfo.h (2)

1 /** 2 Instance variable information. 3 */ 4 @interface YYClassIvarInfo : NSObject 5 @property (nonatomic, assign, readonly) Ivar ivar; ///< ivar opaque struct 6 @property (nonatomic, strong, readonly) NSString *name; ///< Ivar's name 7 @property (