四、实现实体基类中的方法。
  实体基类中的方法是从各个Model中抽象出来的并且可以重复利用的部分,在实体基类的方法中大致包括:生成getter方法,生成setter方法,获取Model类的属性,把字典的值赋给对应的Model, 动态的调用getter方法对实体类的属性值进行遍历。本篇博客中回给出一部分,剩下的一部分会在以后的博客中陆续给出。
  1.根据Key值生成set方法
  首先要编写的方法是传入一个字符串,然后返回该字符串所对应属性的setter方法。这个方法其实很简单的,是把对应的字符串的首字母大写并且拼接上set关键字,再生产SEL并返回,该方法的具体实现如下:
1 #pragma mark -- 通过字符串来创建该字符串的Setter方法,并返回
2 - (SEL) creatSetterWithPropertyName: (NSString *) propertyName{
3
4     //1.首字母大写
5     propertyName = propertyName.capitalizedString;
6
7     //2.拼接上set关键字
8     propertyName = [NSString stringWithFormat:@"set%@:", propertyName];
9
10     //3.返回set方法
11     return NSSelectorFromString(propertyName);
12 }
  2.把字典传入到方法中,并把字典的值赋给相应实体类的属性,该方法需要调用上述方法来生成setter方法,通过setter方法把字典的Value赋值给实体类对应的属性,代码如下,下面代码中的注释还是比较详细的,具体细节参考下面注释的内容了。通过调用这个方法可以把字典的值赋给对应的实体类的属性,调用这个方法的前提是要求字典的key与实体类的属性名必须相同。有的小伙伴会问如果不一样该怎么做呢?这个问题到下篇博客中在进行介绍。
1 /************************************************************************
2  *把字典赋值给当前实体类的属性
3  *参数:字典
4  *适用情况:当网络请求的数据的key与实体类的属性相同时可以通过此方法吧字典的Value
5  *        赋值给实体类的属性
6  ************************************************************************/
7
8 -(void) assginToPropertyWithDictionary: (NSDictionary *) data{
9
10     if (data == nil) {
11         return;
12     }
13
14     ///1.获取字典的key
15     NSArray *dicKey = [data allKeys];
16
17     ///2.循环遍历字典key, 并且动态生成实体类的setter方法,把字典的Value通过setter方法
18     ///赋值给实体类的属性
19     for (int i = 0; i < dicKey.count; i ++) {
20
21         ///2.1 通过getSetterSelWithAttibuteName 方法来获取实体类的set方法
22         SEL setSel = [self creatSetterWithPropertyName:dicKey[i]];
23
24         if ([self respondsToSelector:setSel]) {
25             ///2.2 获取字典中key对应的value
26             NSString  *value = [NSString stringWithFormat:@"%@", data[dicKey[i]]];
27
28             ///2.3 把值通过setter方法赋值给实体类的属性
29             [self performSelectorOnMainThread:setSel
30                                    withObject:value
31                                 waitUntilDone:[NSThread isMainThread]];
32         }
33
34     }
35
36 }
  3.接下来是开始编写实体类的入口了,也是便利初始化方法和便利构造器。并在头文件中留出接口,下面先给出便利初始化方法然后在给出便利构造器。
  (1)下面的代码是实体类的便利初始化方法,当然是实例方法,该方法需要传入一个字典,这个字典中的key是该实体类的属性名,值是要给该实体类的属性赋的值。并且返回该实体类的实例,简单的说是调用-(void) assginToPropertyWithDictionary: (NSDictionary *) data方法,具体代码如下:
  1 - (instancetype)initWithDictionary: (NSDictionary *) data{
  2     {
  3         self = [super init];
  4         if (self) {
  5              [self assginToPropertyWithDictionary:data];
  6         }
  7         return self;
  8     }
  9 }
  (2)下面将要给出便利构造器,当然便利构造器是类方法,并且返回该类的一个实例。用大白话说,便利构造器是分配内存后调用便利初始化方法然后返回该对象的实例,下方是实体类对应的便利构造器:
  1 + (instancetype)modelWithDictionary: (NSDictionary *) data{
  2
  3     return [[self alloc] initWithDictionary:data];
  4
  5 }
  五、测试上面的代码
  上面运行这么多了得运行一下代码看一下结果吧。因为我们这是基于系统的控制台程序,所以我们需要在main函数中进行调用我们编写的方法,需要把我们上面生成的测试字典传入到实体类的构造器中,并且获取实体类的一个实例。该获取的实体类的实例中的属性已经被赋值上了传入的字典的值。具体调用方法如下所示。
  1         BeautifulGirlModel *beautifulGirl = [BeautifulGirlModel modelWithDictionary:data];
  2
  3         NSLog(@"%@", beautifulGirl.girl0);
  运行结果如下:

  后给出笨的赋值方法,也是容易学会的赋值方法,不过这种方式维护起来回不太方便,而且大部分做的都是体力活的,实例如下:
  1         BeautifulGirlModel *beautifulGirl1 = [[BeautifulGirlModel alloc] init];
  2         beautifulGirl1.girl0 = data[@"girl0"];
  3         beautifulGirl1.girl1 = data[@"girl1"];
  4         beautifulGirl1.girl2 = data[@"girl2"];
  5         beautifulGirl1.girl3 = data[@"girl3"];
  6         beautifulGirl1.girl4 = data[@"girl4"];
  7         beautifulGirl1.girl5 = data[@"girl5"];
  8         beautifulGirl1.girl6 = data[@"girl6"];
  9         beautifulGirl1.girl7 = data[@"girl7"];