热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ios开发利用运行时(runtime)字典转模型

现在的ios开发中,我们通常会使用MVC模式。当我们拿到数据的时候,我们要把数据转成模型使用。一般情况我们拿到的数据都是字典。这是我们就需要将字典转成模型对象了。当对象的属性很少的

现在的ios开发中,我们通常会使用MVC模式。当我们拿到数据的时候,我们要把数据转成模型使用。

一般情况我们拿到的数据都是字典。这是我们就需要将字典转成模型对象了。

当对象的属性很少的时候,我们可以直接单独写出字典的键值,进行转换。

_属性 = dict["键"]

当对象的属性很多的时候,我们可以利用KVC批量设置。

setValuesForKeysWithDictionary:<#(NSDictionary *)#>

但是KVC批量转的时候,有个致命的缺点,就是当字典中的键,在对象属性中找不到对应的属性的时候

会报错。

这个时候,我们不妨反过来想一下。我们先获取到对象所有的属性名,然后加入到一个数组里面,然后再遍历,赋值。

在程序运行的时候,抓取对象的属性,这时候,要利用到运行时机制了,详情见下面的代码

 1 + (NSArray *)propertyList {
 2     
 3     // 0. 判断是否存在关联对象,如果存在,直接返回
 4     /**
 5      1> 关联到的对象
 6      2> 关联的属性 key
 7      
 8      提示:在 OC 中,类本质上也是一个对象
 9      */
10     NSArray *pList = objc_getAssociatedObject(self, propertiesKey);
11     if (pList != nil) {
12         return pList;
13     }
14     
15     // 1. 获取`类`的属性
16     /**
17      参数
18      1> 类
19      2> 属性的计数指针
20      */
21     unsigned int count = 0;
22     // 返回值是所有属性的数组 objc_property_t
23     objc_property_t *list = class_copyPropertyList([self class], &count);
24     
25     NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:count];
26     
27     // 遍历数组
28     for (unsigned int i = 0; i i) {
29         // 获取到属性
30         objc_property_t pty = list[i];
31         
32         // 获取属性的名称
33         const char *cname = property_getName(pty);
34         
35         [arrayM addObject:[NSString stringWithUTF8String:cname]];
36     }
37     NSLog(@"%@", arrayM);
38     
39     // 释放属性数组
40     free(list);
41     
42     // 设置关联对象
43     /**
44      1> 关联的对象
45      2> 关联对象的 key
46      3> 属性数值
47      4> 属性的持有方式 reatin, copy, assign
48      */
49     objc_setAssociatedObject(self, propertiesKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC);
50     
51     return arrayM.copy;
52 }

上面的代码中,有两段 判断是否有关联对象,和 设置关联对象的代码。是为了不重复执行此方法。

在获取到上面的属性数组之后,可以写字典转模型的方法了

 1 + (instancetype)objectWithDict:(NSDictionary *)dict {
 2     id obj = [[self alloc] init];
 3     
 4     //    [obj setValuesForKeysWithDictionary:dict];
 5     NSArray *properties = [self propertyList];
 6     
 7     // 遍历属性数组
 8     for (NSString *key in properties) {
 9         // 判断字典中是否包含这个key
10         if (dict[key] != nil) {
11             // 使用 KVC 设置数值
12             [obj setValue:dict[key] forKeyPath:key];
13         }
14     }
15    
16     
17     return obj;
18 }

ios开发- 利用运行时(runtime)字典转模型


推荐阅读
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本文介绍了如何使用Java中的同步方法和同步代码块来实现两个线程的交替打印。一个线程负责打印1到52的数字,另一个线程负责打印A到Z的字母,确保输出顺序为12A34B...5152Z。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 探讨了在有序数列中实现多种查询和修改操作的高效数据结构设计,主要使用线段树与平衡树(Treap)结合的方法。 ... [详细]
  • Redis Hash 数据结构详解
    本文详细介绍了 Redis 中的 Hash 数据类型及其常用命令。Hash 类型用于存储键值对集合,支持多种操作如插入、查询、更新和删除字段值。此外,文章还探讨了 Hash 类型在实际业务场景中的应用,并提供了优化建议。 ... [详细]
  • 本文介绍了 Winter-1-C A + B II 问题的详细解题思路和测试数据。该问题要求计算两个大整数的和,并输出结果。我们将深入探讨如何处理大整数运算,确保在给定的时间和内存限制下正确求解。 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
  • 哈密顿回路问题旨在寻找一个简单回路,该回路包含图中的每个顶点。本文将介绍如何判断给定的路径是否构成哈密顿回路。 ... [详细]
  • 本文探讨了在使用Selenium进行自动化测试时,由于webdriver对象实例化位置不同而导致浏览器闪退的问题,并提供了详细的代码示例和解决方案。 ... [详细]
  • 算法题解析:最短无序连续子数组
    本题探讨如何通过单调栈的方法,找到一个数组中最短的需要排序的连续子数组。通过正向和反向遍历,分别使用单调递增栈和单调递减栈来确定边界索引,从而定位出最小的无序子数组。 ... [详细]
  • TechStride 网站
    TechStride 成立于2014年初,致力于互联网前沿技术、产品创意及创业内容的聚合、搜索、学习与展示。我们旨在为互联网从业者提供更高效的新技术搜索、学习、分享和产品推广平台。 ... [详细]
  • 深入理解T-SQL中的NULL与三值逻辑
    本文探讨了SQL Server中的三值逻辑,解释了谓词计算结果为TRUE、FALSE和UNKNOWN的规则。通过具体示例,详细说明了如何正确处理NULL值,并探讨了在不同约束条件下的行为。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
  • 本文介绍如何在 C++ 中使用链表结构存储和管理数据。通过具体示例,展示了静态链表的基本操作,包括节点的创建、链接及遍历。 ... [详细]
author-avatar
mobiledu2502884587
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有