一、字典转模型的键值对与模型属性不匹配问题

  1. 字典的键个数 < 模型的属性个数 (key 能与模型的属性匹配)

    1> .KVO 方式:

      - setValuesForKeysWithDictionary:

    2> for循环的方式,一一赋值

  2.字典的键个数 = 模型的属性个数 (key 能与模型的属性匹配)

    同1。

  3.字典的个数 > 模型的属性个数 (模型的属性为字典key 的其中一部分)

     一共有三种解决方式

二、解决办法:

  建立一个GXApp的模型,申明两个属性: name(名称)  details(详细信息),在类方法中是直接使用

  

  

  

  

  在控制器中使用:

  

  直接运行:

    Terminating app due to uncaught exception 'NSUnknownKeyException',

  reason: '[<GXApp 0x7ff1a8d41790> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key version .'

解决办法一:

  在类方法中,一个个属性赋值

  

 //
 //  GXApp.m
 //  B01-字典转模型的属性不匹配问题
 //
 //  Created by gxiangzi on 15/8/25.
 //  Copyright (c) 2015年 hqu. All rights reserved.
 //

 #import "GXApp.h"

 @implementation GXApp

 + (instancetype)appWithDict:(NSDictionary*)dict
 {
     GXApp* app = [[GXApp alloc] init];

     // 利用数组存储 模型的属性
     NSArray* parameters = @[ @"name", @"details" ];
     // 遍历字典,判断模型是否有该属性
     [parameters enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL* stop)
     {
         if (dict[obj])
         {
             [app setValue:dict[obj] forKey:obj];
         }
     }];

     return app;
 }

 @end

缺点: 该种方式对极少数属性相对简单,但是扩展性不高。

解决办法二

  运行是机制,在运行时,判断模型的属性,然后赋值

  

 //
 //  GXApp.m
 //  B01-字典转模型的属性不匹配问题
 //
 //  Created by gxiangzi on 15/8/25.
 //  Copyright (c) 2015年 hqu. All rights reserved.
 //

 #import "GXApp.h"
 #import <objc/runtime.h>

 @implementation GXApp

 + (instancetype)appWithDict:(NSDictionary *)dict
 {
     GXApp *app = [[GXApp alloc] init];

     NSArray *array = [app getProperties];

     // 根据属性的值,去数据字典中取对应的值
     [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
         // key 属性值.
         NSString *key = obj;

         if (dict[key]) {

             [app setValue:dict[key] forKey:key];
         }

     }];

     return app;
 }

 // 动态的获取某一个类的属性.
 - (NSArray *)getProperties
 {
     unsigned int count;

     // 获取一个类中的属性
     objc_property_t *properties = class_copyPropertyList(self.class, &count);

     NSMutableArray *array = [NSMutableArray array];

     // 遍历类中的属性,将每一个属性值都转换成 OC 的字符串
     ; i < count; i++) {

         // pro 依然是 C 语言的数据类型
         objc_property_t pro = properties[i];

         // 指向C 语言字符串一个指针.
         const char *name = property_getName(pro);

         NSString *property = [[NSString alloc] initWithUTF8String:name];

         [array addObject:property];
     }

     return array;
 }

 @end

缺点:运行时代码,C语言代码,代码不易记住

解决办法三、

   重写 - setValuesForKeysWithDictionary:

  

//
//  GXApp.m
//  B01-字典转模型的属性不匹配问题
//
//  Created by gxiangzi on 15/8/25.
//  Copyright (c) 2015年 hqu. All rights reserved.
//

#import "GXApp.h"

@implementation GXApp

+(instancetype)appWithDict:(NSDictionary *)dict
{
    GXApp *app = [[GXApp alloc] init];

    [app setValuesForKeysWithDictionary:dict];

    return app;
}

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    // do nothing
}

@end

解释:  

  官方解释:

  - (void)setValue:(id)value forUndefinedKey:(NSString *)key;

Given that an invocation of -setValue:forKey: would be unable to set the keyed value because the type of the parameter of the corresponding accessor method is an NSNumber scalar type or NSValue structure type but the value is nil, set the keyed value using some other mechanism. The default implementation of this method raises an NSInvalidArgumentException. You can override it to map nil values to something meaningful in the context of your application.

当利用kvo赋值的适合,如果键值不匹配,就会报一个 NSInvalidArgumentException 异常,可以重写这个方法可以解决

  

【iOS问题】字典转模型,属性个数不匹配问题的更多相关文章

  1. iOS开发—字典转模型,KVC设计模式

    iOS开发UI基础—字典转模型 开发中,通常使用第三方框架可以很快的实现通过字典转模型,通过plist创建模型,将字典的键值对转成模型属性,将模型转成字典,通过模型数组来创建一个字典数组,通过字典数组 ...

  2. iOS-字典转模型(单模型)的实现

    用模型取代字典的好处 使用字典的坏处 一般情况下,设置数据和取出数据都使用“字符串类型的key”,编写这些key时,编译器不会有任何友善提示,需要手敲, eg:dict[@"name&quo ...

  3. ios中字典转模型的创建以及简单用法

    // appModel.h // Created by zzqqrr on 17/8/19. // #import <Foundation/Foundation.h> @interface ...

  4. ios 根据字典自动生成属性

    - (void)createPropertyCode{ NSMutableString *codes = [NSMutableString string]; // 遍历字典 [self enumera ...

  5. iOS开发——高级技术精选OC篇&Runtime之字典转模型实战

    Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://w ...

  6. 字典转模型框架 Mantle的使用:国外程序员最常用的iOS模型

    Mantle简介 Mantle 是iOS和Mac平台下基于Objective-C编写的一个简单高效的模型层框架. Mantle能做什么 Mantle可以轻松把JSON数据.字典(Dictionary) ...

  7. iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)

    一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...

  8. iOS开发UI篇—字典转模型

    iOS开发UI篇—字典转模型 一.能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 // // LFViewController.m // 03-应用管理 // // Creat ...

  9. IOS开发UI基础之Plis文件-字典转模型

    什么是plist文件? 在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低 因此,可以考虑将经常变的数据放在⽂文件中进⾏行存储,程 ...

随机推荐

  1. Java习惯用法总结

    在微博中看到的一个不错的帖子,总结的很详细,拷贝过来,一是为了方便自己查阅,也能和大家一起共享,后面有原文的链接地址: 在Java编程中,有些知识 并不能仅通过语言规范或者标准API文档就能学到的.在 ...

  2. [置顶] 【Git入门之八】分支管理

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12309385 1.分支又是神马? 我为什么说又是... 分支就是一个我们能通 ...

  3. JS 实现显示和隐藏div(以百度地图为例)

    主要参考的文章:https://my.oschina.net/xsh1208/blog/215811,https://zhidao.baidu.com/question/568774688.html ...

  4. poj 3271 Lilypad Pond bfs

    因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步). 然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数 ...

  5. [Redux] Avoiding Array Mutations with concat(), slice(), and ...spread

    For Redux, you cannot use mutable methods like push, splice. Need to use immutable methods such as c ...

  6. tomcat7源代码Bootstrap

    tomcat的启动从bootstrap的main方法開始,在main方法中主要是做了三件事,调用init方法初始化自己.调用catalinaDaemon对象 的setAwait方法设置它的await属 ...

  7. Qt中使用cout, cin, cerr

      在Qt中,用的最多的是GUI页面,但GUI比较慢,有些小的试验不妨先用console,当然在Qt里面可以直接使用cout, cin这些. 不过可能不会兼容Qt自带的一些类型,比如QByteArra ...

  8. Linux设备驱动——内核定时器

    内核定时器使用 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c 文件 ...

  9. Android 仿Win8的metro的UI界面(上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23441455 昨晚没事手机下载了一些APP,发现现在仿win8的主界面越来越多, ...

  10. 深搜最基础题---全排列And组合数

    这个是理解标记和取消标记,用一个vis数组来标记 全排列代码: #include <stdio.h> ]; ]; int n; void dfs(int step)//step是当前已经进 ...