字典转模型深层次理解

@interface ViewController ()

/** 所有的车数据*/
@property (nonatomic ,strong) NSArray *carGroups;
@end

@implementation ViewController


- (NSArray *)carGroups
{
    if (!_carGoups) {
        // 告诉MJExtension这个框架CarGroup的cars数组属性中装的是XMGCar 模型
        [CarGroup mj_setupObjectClassInArray:^NSDictionary *{
            return @{@"cars" : [Car class]};
        }];
       
        _carGoups = [CarGroup mj_objectArrayWithFilename:@"cars.plist"];
    }
    return _carGoups;
}

在控制台输出plist文件中的key(属性)


  • 前提:plist中最外层为字典,但是只能获取到第一层的key属性(即模型中的属性),第二层获取不了)
  • 注意:以后直接在项目中导入NSDictionary+PropertyCode.h好.m文件即可.用的时候直接输入ViewController.h中的这些代码即可

ViewController.h文件


 NSString *fileName = [[NSBundle mainBundle] pathForResource:@"status.plist" ofType:nil];
    // 获取字典
   NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:fileName];

[dict createPropetyCode];

NSDictionary+PropertyCode.h文件

#import <Foundation/Foundation.h>

@interface NSDictionary (PropertyCode)

// 生成属性代码
- (void)createPropetyCode;

@end

NSDictionary+PropertyCode.m文件

#import "NSDictionary+PropertyCode.h"

@implementation NSDictionary (PropertyCode)

// 私有API:真实存在,但是苹果没有暴露出来,不给你
// isKindOfClass:判断下是否是当前类或者子类

// 自动生成属性代码
- (void)createPropetyCode
{
    // 模型中属性根据字典的key
    // 有多少个key,生成多少个属性
    
    NSMutableString *codes = [NSMutableString string];
    // 遍历字典
    [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull value, BOOL * _Nonnull stop) {
        NSString *code = nil;
        
        if ([value isKindOfClass:[NSString class]]) {
          code = [NSString stringWithFormat:@"@property (nonatomic, strong) NSString *%@;",key];
        } else if ([value isKindOfClass:NSClassFromString(@"__NSCFBoolean")]){
            code = [NSString stringWithFormat:@"@property (nonatomic, assign) BOOL %@;",key];
        } else if ([value isKindOfClass:[NSNumber class]]) {
             code = [NSString stringWithFormat:@"@property (nonatomic, assign) NSInteger %@;",key];
        } else if ([value isKindOfClass:[NSArray class]]) {
            code = [NSString stringWithFormat:@"@property (nonatomic, strong) NSArray *%@;",key];
        } else if ([value isKindOfClass:[NSDictionary class]]) {
            code = [NSString stringWithFormat:@"@property (nonatomic, strong) NSDictionary *%@;",key];
        }
        
        // 拼接字符串
        [codes appendFormat:@"\n%@\n",code];

    }];
    
    NSLog(@"%@",codes);
    
}

@end

38-01.png

如何打印出plist文件中的内容

最外层为数组

38-02.png

最外层为字典

38-04.png

MJ的字典转模型


  • 字典转模型的含义:
    • 字典:里面全都是key:value的形式
    • 字典数组就是数组里面有字典,模型数组就是数组里面有模型.
    • 字典数组转模型数组-->利用kvc思想,即一个key对应一个value的形式把字典中的数据写到模型中
    • 字典转模型 字典的含义:要转换的数据必须是字典。
    • 字典转模型:把字典里的数据转成模型
    • 拓展:plist文件的root只有一个,不能有多个。
      • 例如root为字典,那么这里面可以有很多字典,也可以装很多数组,里面的这些字典和数组就不是root了,他们在root下。
    • 字典转模型,最终操作的是字典D。无论这个字典D的上一层是数组还是字典,你能拿到字典D的上一层中就行。你必须在字典D的上一层来操作字典D,你必须在字典D的上一层来操作字典D,你必须在字典D的上一层来操作字典D,能拿到字典D的上一层,那么你就可以字典转模型了(重要的事情说三遍).
    • MJ框架常用的方法是:字典的上一层是数组。开发中,上一层一般是数组。谁闲着没事,搞那么繁琐,当然是越简单越好.

MJ框架应用场景:


  • 1:最外层为数组+数组里面是全是字典:直接用: [类名 mj_objectArrayWithFilename:@"aa.plist"];
  • 2:最外层是字典,字典中装的key是数组,value就是数组中全部的内容(不是具体哪一个,看其他场景1你就知道了),用:self.topics = [类名 mj_objectArrayWithKeyValuesArray:responseObject[@"数组名"]];
    • responseObject[@"数组名"]中的responseObject是字典,整体是数组。
    • 这个方法硬性要求:必须把范围先精确到数组(为的是让这个数组作为这个方法的参数),才能操作数组中的字典(mj底层帮我们实现)。
    • 2方法的使用范围:字典的父层必须是数组。否则这个方法不能用。因为这个方法就是让你传数组作为这个方法作为参数,默认要求让你这个数组里面必须装的是字典。

MJ 字典转模型和普通字典转模型的精华区别


  • 普通字典:用对服务器或者plist中的这四个key:A,B,C,D进行字典转模型,如果模型中声明了A,B,C,但是没有声明D,就会报错。解决办法:在模型类的.m文件重写setValue:forUndefinedKey:方法,然后什么也不做
  • MJ的字典转模型,如果也是上面那种情形,MJ底层自动给你写了这个方法,所以不用担心上面那个问题了

转一层
38-05.png

转两层

38-06.png

38-07.png

其他场景1(详细看截图左侧的注释)
38-08.png
其他场景2(注释太给力了,太精华了)
38-41.png
其他场景,注意理解

40-21.png

普通字典转模型


  • 普通字典转模型,必须在模型中.h文件中声明一个方法供外界调用,最好是类方法,另外参数必须是字典类型的。因为字典转模型,你得把字典传进模型的类中啊(精华),这样才能把字典中的key赋值给模型中的key,不然你怎么转?
  • for (NSDictionary *carGroupDict in dictArray)的含义:
    -遍历dictArray数组中的每一个对象,因为知道了每一个对象是字典类型,所以用NSDictionary类型的carGroupDict保存每一个遍历出来的对象
38-10.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容