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


    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的真实类型

      

    可以选择,但是别选择放弃
  • 相关阅读:
    VS编译错误:#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version
    C++ STL std::copy 详解
    JavaScript:{}、new Object和Object.create的区别
    函数声明和函数表达式的区别
    Java基础重写override
    Java基础多态数组
    Java基础编译类型和运行类型(多态)
    Java基础继承的内存分析
    Java基础访问修饰符
    Java基础继承的使用
  • 原文地址:https://www.cnblogs.com/hangdada/p/4990869.html
Copyright © 2020-2023  润新知