字典转模型方式实现九宫格

1.从plist文件加载数据

2.获取plist文件,转为数组 

@property (nonatomic , strong) NSArray *appList;

// 懒加载属性

-(NSArray *)appList

{

    // 将字典转为模型

    if(_appList == nil){

//        _appList = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil]];

        NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil]];

        // 创建临时数组

        NSMutableArray *arrayM = [NSMutableArray array];

        for(NSDictionary *dict in array){

            hdAppInfo *appInfo = [hdAppInfo appInfoWithDict:dict];

            [arrayM addObject:appInfo];

        }

       // 将临时数组为属性赋值

        _appList = arrayM;

    }

    return _appList;

}

3.字典转模型的好处:

(1)降低代码的耦合度

(2)所有字典转模型部分的代码统一集中在一处处理,降低代码出错的几率

(3)在程序中直接使用模型的属性操作,提高编码效率 

(4)调用方不用关心模型内部的任何处理细节

4.字典转模型的注意点:

4.1声明属性 : 

@property (nonatomic , copy)NSString *name;

@property (nonatomic , copy)NSString *icon;

 

// 4.2 instancetype 主要用于在类方法实例化对象,让编译器主动推断对象的实际类型

/** 通常在写模型的实例化方法时,以下两个方法,都需要实现 */

模型应该提供一个可以传入字典参数的构造方法

- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)xxxWithDict:(NSDictionary *)dict;

提示:在模型中合理地使用只读属性,可以进一步降低代码的耦合度。

4.3构造方法实现

/** 使用字典实例化模型 */

-(instancetype) initWithDict:(NSDictionary *)dict

{

    // self是对象

    self = [super init];

    if (self) {

        // 用字典给属性赋值,所有与plist键值有关的方法,均在此处!

        self.name = dict[@"name"];

        self.icon = dict[@"icon"];

    }

    return self;

}

 

// 类方法可以快速实例化一个对象

+(instancetype) appInfoWithDict:(NSDictionary *)dict

{

    // self class

    return [[self alloc]initWithDict:dict];

}

5.补充说明

5.1.readonly属性

 (1)@property中readonly表示不允许修改对象的指针地址,但是可以修改对象的属性值。

 (2)通常使用@property关键字定义属性时,会生成getter&setter方法,还会生成一个带下划线的成员变量。

 (3)如果是readonly属性,只会生成getter方法,不会生成带下划线的成员变量.

5.2.instancetype类型

(1)instancetype会让编译器检查实例化对象的准确类型 
(2)instancetype只能用于返回类型,不能当做参数使用

5.3.instancetype & id的比较

(1) instancetype在类型表示上,跟id一样,可以表示任何对象类型

(2) instancetype只能用在返回值类型上,不能像id一样用在参数类型上

(3) instancetype比id多一个好处:编译器会检测instancetype的真实类型

  

可以选择,但是别选择放弃
原文地址:https://www.cnblogs.com/hangdada/p/4990869.html