YYKit系列之——YYModel使用

来源:互联网 发布:题目医院数据库 编辑:程序博客网 时间:2024/05/29 10:11

目录

  • JSON转字符串
  • 普通字典转模型
  • 模型属性有自定义的模型YYUSer
  • 属性有数组(数组里自定义模型),还有字典和集合
  • 字典里的key与模型里的属性名不一致

常用的几个方法:

# json转模型+ (instancetype)yy_modelWithJSON:(id)json;# 模型转字符串- (NSString *)yy_modelToJSONString # 字典转模型+ (instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary ;# 声明数组、字典或者集合里的元素类型时要重写+ (nullable NSDictionary<NSString *, id> *)modelContainerPropertyGenericClass;# 字典里的key值与模型的属性值不一致要重复+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper;# 下面两者是属性值在两个dic与模型之间的转化方法(自己看代码吧~
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic ;- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic;

代码演示和转模型注释:

一、JSON转字符串

执行代码:

// JSON ->模型 (内部实现:json -> 字典 -> 模型)YYBook *book = [YYBook yy_modelWithJSON:@"     \                {                                           \                \"name\": \"Harry Potter\",              \                \"pages\": 512,                          \                \"publishDate\": \"2010-01-01\"          \                }"];//模型 -> 字符串NSString *bookJSON = [book yy_modelToJSONString];NSLog(@"Book: %@", bookJSON);

二、普通字典转模型

模型代码:

@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) uint64_t pages;@property (nonatomic, strong) NSDate *publishDate;

执行代码:

 NSDictionary *dic = @{                          @"name": @"Harry Potter",                          @"pages": @(512),                          @"publishDate": @"2010-01-01"                          };YYBook *book1 = [YYBook yy_modelWithDictionary:dic];NSString *bookJSON1 = [book1 yy_modelToJSONString];NSLog(@"bookJSON: %@",bookJSON1);

三、模型属性有自定义的模型YYUSer

模型代码:

@property (nonatomic, assign) uint64_t rid;@property (nonatomic, copy) NSString *name;@property (nonatomic, strong) NSDate *createTime;@property (nonatomic, strong) YYUser *owner;  #自定义模型

执行代码:

NSDictionary *dic = @{                      @"rid": @(123456789),                      @"name": @"YYKit",                      @"createTime" : @"2011-06-09T06:24:26Z",                      @"owner": @{                              @"uid" : @(989898),                              @"name" : @"mawenxing"                              }                      };YYRepo *repo1 = [YYRepo yy_modelWithDictionary:dic];NSLog(@"Repo1: %@\nowner.name=%@", repo1.name,repo1.owner.name);

四、属性有数组属性里有数组(数组里自定义模型),还多字典和集合

模型代码:

# YYAlbum.h@property (nonatomic, copy) NSString *name;@property (nonatomic, strong) NSArray *photos; # Array<YYPhoto>@property (nonatomic, strong) NSDictionary *likedUsers; # Key:name(NSString) Value:user(YYUser)@property (nonatomic, strong) NSSet *likedUserIds; # Set<NSNumber># YYPhoto.h@property (nonatomic, copy) NSString *url;@property (nonatomic, copy) NSString *desc;# YYAlbum.m#把数组里面带有对象的类型专门按照这个方法,这个格式写出来-(nullable NSDictionary<NSString *, id> *)modelContainerPropertyGenericClass{    return @{             @"photos"       : YYPhoto.class,             @"likedUsers"   : YYUser.class,             @"likedUserIds" : NSNumber.class             };}

执行代码:

///源代码这里有些成字典的,大家如果看不懂这个JSON可以看字典YYAlbum *album = [YYAlbum yy_modelWithJSON:@"          \                      {                                                   \                      \"name\" : \"Happy Birthday\",                      \                      \"photos\" : [                                      \                      {                                               \                      \"url\":\"http://example.com/1.png\",       \                      \"desc\":\"Happy~\"                         \                      },                                              \                      {                                               \                      \"url\":\"http://example.com/2.png\",       \                      \"desc\":\"Yeah!\"                          \                      }                                               \                      ],                                                  \                      \"likedUsers\" : {                                  \                      \"Jony\" : {\"uid\":10001,\"name\":\"Jony\"},   \                      \"Anna\" : {\"uid\":10002,\"name\":\"Anna\"}    \                      },                                                  \                      \"likedUserIds\" : [10001,10002]                    \                      }"];    NSString *albumJSON = [album yy_modelToJSONString];    NSLog(@"Album: %@", albumJSON);

五、字典里的属性名与模型里的属性名不一致

模型代码:

# YYMessage.h@property (nonatomic, assign) uint64_t messageId;@property (nonatomic, strong) NSString *content;@property (nonatomic, strong) NSDate *time;# YYMessage.m/*! *  1.该方法是 `字典里的属性Key` 和 `要转化为模型里的属性名` 不一样 而重写的 *  前:模型的属性   后:字典里的属性 */+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper{    return @{@"messageId":@"i",             @"content":@"c",             @"time":@"t"};}/*! *  2. 下面的两个方法 `字典里值`与`模型的值`类型不一样`需要转换`而重写的方法 *   NSDate *time     dic[@"t"]是double类型的的秒数 *//// Dic -> model- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {    self.time = (NSDate *)[NSDate dateWithTimeIntervalSince1970:[dic[@"t"] doubleValue]/1000];    return YES;}/// model -> Dic- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {    dic[@"t"] = @([self.time timeIntervalSince1970] * 1000).description;    return YES;}

执行代码:

/*! *  第一种:字典版 */NSDictionary *dic = @{@"i":@2000000001,                      @"c":@"Hello",                      @"t":@1437237598000};YYMessage *message = [YYMessage yy_modelWithDictionary:dic];NSString *messageJSON = [message yy_modelToJSONString];NSLog(@"messageJSON: %@", messageJSON);/*! *  第二种:JSON版 */YYMessage *message = [YYMessage yy_modelWithJSON:@"{\"i\":\"2000000001\",\"c\":\"Hello\",\"t\":\"1437237598000\"}"];NSString *messageJSON = [message yy_modelToJSONString];NSLog(@"messageJSON: %@", messageJSON);

演示源码:吻我





    • 一YYModel的使用场景
      • 简单的 Model 与 JSON 相互转换
      • Model 属性名和 JSON 中的 Key 不相同
      • Model 包含其他 Model
      • 容器类属性
      • 黑名单与白名单
      • 数据校验与自定义转换
      • CodingCopyinghashequaldescription
    • 二ESJsonFormat与YYModel的结合使用

开篇说明: 
虽然网上有很多讲解YYModel使用方法的文章,包括YYModel作者也在github上对其做了使用说明。 
但在我实际使用过程中,依然发现文档的不完善,比如对于复杂的模型(如多层嵌套)讲解的仍不透彻,同时本文也会介绍一神器配合YYModel使用,让你感受分分钟搞定模型创建的酸爽。 
当然为了减少读者的学习成本,本会对YYModel作者的文档进行丰富和扩展。

可在github上下载Demo,以便更直观了解各种使用场景详细代码。 
文章只要包含:

    1. 详解YYModel的多种使用场景
    1. 拓展插件,让你一分钟搞定所有的模型的创建和调用。

一、YYModel的使用场景

1.简单的 Model 与 JSON 相互转换

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// JSON:</span>{    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"uid"</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">123456</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Harry"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"created"</span>:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1965-07-31T00:00:00+0000"</span>}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Model:</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">User</span> : <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NSObject</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> UInt64 uid;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *name;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> *created;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">User</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

-

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 将 JSON (NSData,NSString,NSDictionary) 转换为 Model:</span>User *user = [User yy_modelWithJSON:json];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 将 Model 转换为 JSON 对象:</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDictionary</span> *json = [user yy_modelToJSONObject];</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

当 JSON/Dictionary 中的对象类型与 Model 属性不一致时,YYModel 将会进行如下自动转换。自动转换不支持的值将会被忽略,以避免各种潜在的崩溃问题。

JSON/DictionaryModelNSStringNSNumber,NSURL,SEL,ClassNSNumberNSStringNSString/NSNumberC number (BOOL,int,float,NSUInteger,UInt64,…)
NaN and Inf will be ignoredNSStringNSDate parsed with these formats:
yyyy-MM-dd
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd’T’HH:mm:ss
yyyy-MM-dd’T’HH:mm:ssZ
EEE MMM dd HH:mm:ss Z yyyyNSDateNSString formatted with ISO8601:
“YYYY-MM-dd’T’HH:mm:ssZ”NSValuestruct (CGRect,CGSize,…)NSNullnil,0“no”,”false”,…@(NO),0“yes”,”true”,…@(YES),1

2.Model 属性名和 JSON 中的 Key 不相同

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// JSON:</span>{    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"n"</span>:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Harry Pottery"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"p"</span>: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">256</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ext"</span> : {        <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"desc"</span> : <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"A book written by J.K.Rowing."</span>    },    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ID"</span> : <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100010</span>}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Model:</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Book</span> : <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NSObject</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *name;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSInteger</span> page;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *desc;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *bookID;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Book</span></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//返回一个 Dict,将 Model 属性名对映射到 JSON 的 Key。</span>+ (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDictionary</span> *)modelCustomPropertyMapper {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> @{@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span> : @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"n"</span>,             @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"page"</span> : @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"p"</span>,             @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"desc"</span> : @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ext.desc"</span>,             @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"bookID"</span> : @[@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"id"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ID"</span>,@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"book_id"</span>]};}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul>

你可以把一个或一组 json key (key path) 映射到一个或多个属性。如果一个属性没有映射关系,那默认会使用相同属性名作为映射。 
在 json->model 的过程中:如果一个属性对应了多个 json key,那么转换过程会按顺序查找,并使用第一个不为空的值。 
在 model->json 的过程中:如果一个属性对应了多个 json key (key path),那么转换过程仅会处理第一个 json key (key path);如果多个属性对应了同一个 json key,则转换过过程会使用其中任意一个不为空的值。

3.Model 包含其他 Model

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// JSON</span>{    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"author"</span>:{        <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"J.K.Rowling"</span>,        <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"birthday"</span>:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1965-07-31T00:00:00+0000"</span>    },    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Harry Potter"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"pages"</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">256</span>}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Model: 什么都不用做,转换会自动完成</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Author</span> : <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NSObject</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *name;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> *birthday;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Author</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Book</span> : <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NSObject</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *name;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> NSUInteger pages;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> Author *author; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Book 包含 Author 属性</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Book</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li></ul>

-

4.容器类属性

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Shadow</span>, <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Border</span>, <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Attachment</span>;</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Attributes</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *name;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSArray</span> *shadows; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Array<Shadow></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> NSSet *borders; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Set<Border></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableDictionary</span> *attachments; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Dict<NSString,Attachment></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Attributes</span></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 返回容器类中的所需要存放的数据类型 (以 Class 或 Class Name 的形式)。</span>+ (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDictionary</span> *)modelContainerPropertyGenericClass {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> @{@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"shadows"</span> : [Shadow class],             @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"borders"</span> : Border<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.class</span>,             @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"attachments"</span> : @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Attachment"</span> };}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

在实际使用过过程中,[Shadow class]Border.class@"Attachment"没有明显的区别。 
这里仅仅是创建作者有说明,实际使用时,需要对其遍历,取出容器中得字典,然后继续字典转模型。(YYModel的核心是通过runtime获取结构体中得Ivars的值,将此值定义为key,然后给key赋value值,所以我们需要自己遍历容器(NSArray,NSSet,NSDictionary),获取每一个值,然后KVC)。

-

  • 具体的代码实现如下:
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDictionary</span> *json =[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> getJsonWithJsonName:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ContainerModel"</span>];ContainerModel *containModel = [ContainerModel yy_modelWithDictionary:json];<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDictionary</span> *dataDict = [containModel valueForKey:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"data"</span>];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//定义数组,接受key为list的数组</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.listArray</span> = [dataDict valueForKey:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"list"</span>];  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//遍历数组</span>[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.listArray</span> enumerateObjectsUsingBlock:^(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span>  _Nonnull obj, NSUInteger idx, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span> * _Nonnull stop) {        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDictionary</span> *listDict = obj;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//获取数组中得字典</span>        List *listModel = [List yy_modelWithDictionary:listDict];        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//获取count 和 id</span>        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *count = [listModel valueForKey:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"count"</span>];        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span> = [listModel valueForKey:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"id"</span>];</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

-

5.黑名单与白名单

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">User</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *name;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> NSUInteger age;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Attributes</span></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 如果实现了该方法,则处理过程中会忽略该列表内的所有属性</span>+ (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSArray</span> *)modelPropertyBlacklist {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> @[@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"test1"</span>, @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"test2"</span>];}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 如果实现了该方法,则处理过程中不会处理该列表外的属性。</span>+ (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSArray</span> *)modelPropertyWhitelist {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> @[@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>];}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul>

-

6.数据校验与自定义转换

实际这个分类的目的比较简单和明确。 
就是对判断是否为时间戳,然后对时间戳进行处理,调用 
_createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue]; 
获取时间。

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// JSON:</span>{    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Harry"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"timestamp"</span> : <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1445534567</span>     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//时间戳</span>}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Model:</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">User</span></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *name;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> *createdAt;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">User</span></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 当 JSON 转为 Model 完成后,该方法会被调用。</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 你可以在这里对数据进行校验,如果校验不通过,可以返回 NO,则该 Model 会被忽略。</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 你也可以在这里做一些自动转换不能完成的工作。</span>- (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)modelCustomTransformFromDictionary:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDictionary</span> *)dic {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSNumber</span> *timestamp = dic[@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"timestamp"</span>];    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (![timestamp isKindOfClass:[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSNumber</span> class]]) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NO</span>;    _createdAt = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> dateWithTimeIntervalSince1970:timestamp<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.floatValue</span>];    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">YES</span>;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 当 Model 转为 JSON 完成后,该方法会被调用。</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 你可以在这里对数据进行校验,如果校验不通过,可以返回 NO,则该 Model 会被忽略。</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 你也可以在这里做一些自动转换不能完成的工作。</span>- (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)modelCustomTransformToDictionary:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableDictionary</span> *)dic {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!_createdAt) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NO</span>;    dic[@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"timestamp"</span>] = @(n<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.timeIntervalSince1970</span>);    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">YES</span>;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul>
  • 需要注意的时,如果用插件,对时间戳类型或默认创建为NSUInteger类型,需要将其更改为NSDate类型。

-

7.Coding/Copying/hash/equal/description

以下方法都是YYModel的简单封装,实际使用过程和系统方法区别不大。对其感兴趣的可以点进方法内部查看。

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">YYShadow</span> :<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NSObject</span> <<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NSCoding</span>, <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NSCopying</span>></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>, copy) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *name;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">assign</span>) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">CGSize</span> size;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">YYShadow</span></span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 直接添加以下代码即可自动完成</span>- (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)encodeWithCoder:(NSCoder *)aCoder {     [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> yy_modelEncodeWithCoder:aCoder]; }- (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span>)initWithCoder:(NSCoder *)aDecoder {     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> = [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span> init];     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> yy_modelInitWithCoder:aDecoder]; }- (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span>)copyWithZone:(NSZone *)zone {     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> yy_modelCopy]; }- (NSUInteger)hash {     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> yy_modelHash]; }- (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)isEqual:(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span>)object {     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> yy_modelIsEqual:object]; }- (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *)description {     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> yy_modelDescription]; }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul>

-

二、ESJsonFormat与YYModel的结合使用

彩蛋 
给大家介绍一款插件,配合ESJsonFormat

配图: 
YYModel的gif

使用方法: 
快捷键:shift + control + J 
插件安装方法比较简单,在此不赘述,不知道可自行google。

好处

    1. 可以直接将json数据复制,ESJsonFormat会根据数据类型自动生成属性。(建议还是要自行检查,比如时间戳,系统会默认帮你生成为NSUInteger,而我们想要的为NSDate类型)
    1. 对于多模型嵌套,不必创建多个文件,ESJsonFormat会自动在一个文件下创建多重类型,极其便捷。


至此YYModel的使用已讲解完毕,关于YYModel的底层核心是运用runtime获取类结构体中Ivars,进行KVC操作,然后根据不同情况进行分别处理。 
此处只是传递给大家一个概念,不展开讲解,网上有很多源码分析文章,可自学google学习。 



0 0
原创粉丝点击