【IOS问题】字典转模型,属性个数不匹配问题

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

  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 .‘

解决办法一:

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

  

 1 //
 2 //  GXApp.m
 3 //  B01-字典转模型的属性不匹配问题
 4 //
 5 //  Created by gxiangzi on 15/8/25.
 6 //  Copyright (c) 2015年 hqu. All rights reserved.
 7 //
 8
 9 #import "GXApp.h"
10
11 @implementation GXApp
12
13 + (instancetype)appWithDict:(NSDictionary*)dict
14 {
15     GXApp* app = [[GXApp alloc] init];
16
17     // 利用数组存储 模型的属性
18     NSArray* parameters = @[ @"name", @"details" ];
19     // 遍历字典,判断模型是否有该属性
20     [parameters enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL* stop)
21     {
22         if (dict[obj])
23         {
24             [app setValue:dict[obj] forKey:obj];
25         }
26     }];
27
28     return app;
29 }
30
31 @end

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

解决办法二

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

  

 1 //
 2 //  GXApp.m
 3 //  B01-字典转模型的属性不匹配问题
 4 //
 5 //  Created by gxiangzi on 15/8/25.
 6 //  Copyright (c) 2015年 hqu. All rights reserved.
 7 //
 8
 9 #import "GXApp.h"
10 #import <objc/runtime.h>
11
12 @implementation GXApp
13
14 + (instancetype)appWithDict:(NSDictionary *)dict
15 {
16     GXApp *app = [[GXApp alloc] init];
17
18     NSArray *array = [app getProperties];
19
20
21     // 根据属性的值,去数据字典中取对应的值
22     [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
23         // key 属性值.
24         NSString *key = obj;
25
26         if (dict[key]) {
27
28             [app setValue:dict[key] forKey:key];
29         }
30
31     }];
32
33     return app;
34 }
35
36 // 动态的获取某一个类的属性.
37 - (NSArray *)getProperties
38 {
39     unsigned int count;
40
41     // 获取一个类中的属性
42     objc_property_t *properties = class_copyPropertyList(self.class, &count);
43
44     NSMutableArray *array = [NSMutableArray array];
45
46     // 遍历类中的属性,将每一个属性值都转换成 OC 的字符串
47     for (int i = 0; i < count; i++) {
48
49         // pro 依然是 C 语言的数据类型
50         objc_property_t pro = properties[i];
51
52         // 指向C 语言字符串一个指针.
53         const char *name = property_getName(pro);
54
55         NSString *property = [[NSString alloc] initWithUTF8String:name];
56
57         [array addObject:property];
58     }
59
60     return array;
61 }
62
63 @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 异常,可以重写这个方法可以解决

  

时间: 2024-10-08 09:46:27

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

iOS模型设计---字典转模型

 iOS模型设计 在iOS开发中,模型一词几乎伴随着每个程序员的开发生涯.在接触模型之前,小编在开发中也会经常碰到逻辑混乱.条理不清晰等情况.接下来,小编将会带领大家学习MVC架构中重要的一环---数据模型的建立. 开始之前,我们以一个例子来进行阐述.小编在上一篇文章的(iOS UI设计-九宫格布局)结尾留下了一个九宫格的UI设计界面,如图. 整个布局中,每个按钮模块所需的图标.名称均来自数据文件(此处为plist文件).接下来,我们来了解一下如何将该数据封装成模型,避免直接从ViewCon

6.ios之字典与模型

1.用模型取代字典的好处 ?使用字典的坏处 ?一般情况下,设置数据和取出数据都使用"字符串类型的key",编写这些key时,编译器不会有任何友善提示,需要手敲 dict[@"name"] =@"Jack"; NSString*name = dict[@"name"]; ?手敲字符串key,key容易写错 ?Key如果写错了,编译器不会有任何警告和报错,造成设错数据或者取错数据 ? ?使用模型的好处 ?所谓模型,其实就是数据模型

IOS 开发学习笔记-基础 UI(10)九宫格布局,块动画,字典转模型,Xib使用

大概如下图示:九个应用图标的样子 功能分析 (1)以九宫格的形式展示应用信息 (2)点击下载按钮后,做出相应的操作 步骤分析 (1)加载应用信息 (2)根据应用的个数创建对应的view (3)监听下载按钮点击 思路整理 要在支持文件夹里,放入 plist 文件,且拖拽素材到 supporting files,注意勾选的项目的区别: 大多数情况,往项目中拖拽素材时,通常选择 Destination, Folders:选择第一项:创建组,这样 xcode 导航显式的是黄色文件夹,要知道,Xcode中

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

Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://www.cnblogs.com/iCocos/p/4676679.html http://www.cnblogs.com/iCocos/p/4725527.html 关于runtime的详细介绍及其相关的小实例 好了,这里就不多废话了,直接开干! 先来看看怎么使用Runtime给模型类赋值 iOS开发

iOS开发UI篇—字典转模型

iOS开发UI篇—字典转模型 一.能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 // // LFViewController.m // 03-应用管理 // // Created by apple on 14-5-22. // Copyright (c) 2014年 heima. All rights reserved. // #import "LFViewController.h" @interface LFViewController () @proper

iOS中实现plist中读取数据实现Cell的显示(字典转模型,实现按序分组)修改图片的尺寸

RootViewController.m #import "RootViewController.h" #import "UIImage+UIImageScale.h" @interface RootViewController ()<UITableViewDataSource,UITableViewDelegate> @property (nonatomic, retain) NSArray *apps; //存放排好序的keys @property

iOS之KVC字典转模型的底层实现

KVC: Key Value Coding (键值编码) 在iOS开发中,KVC是我们经常要使用的技术.那么KVC有什么作用呢?简单列举一下下面几种: 取值和赋值(开发中基本不用) 获取对象私有变量的值.(经常使用,例如UIPageContorl分页, 设置圆点为图片) 改变对象私有变量的值(经常使用) 简单的字典转模型(偶尔使用) 模型转字典 批量取值 KVC字典转模型的底层实现 通常我们手动将字典转模型的话,会在模型中提供一个类方法接收一个字典,在这个方法中将字典转换成模型,再将转换好的模型

文顶顶 iOS开发UI篇—字典转模型

iOS开发UI篇—字典转模型 一.能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 1 // 2 // LFViewController.m 3 // 03-应用管理 4 // 5 // Created by apple on 14-5-22. 6 // Copyright (c) 2014年 heima. All rights reserved. 7 // 8 9 #import "LFViewController.h" 10 11 @interface LFV

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

什么是plist文件? 在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低 因此,可以考虑将经常变的数据放在?文件中进?行存储,程序启动后从?文件中 读取最新的数据.如果要变动数据,直接修改数据?文件即可,不?用修改代码 一般可以使?用属性列表?文件存储NSArray或者NSDictionary之类的数据,这 种“属性列表?文件”的扩展名是plist,因此也称为“plist?文件” 在Xcode创建plist文件的步骤: 解析