【iOS】YYModel初学习

前言

YYModel是一个OC的开源库,用于处理json数据和iOS应用中的数据的相互转换,在使用场景中非常的实用。

常用方法

// 字典转模型
+ (nullable instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary;
// json转模型
+ (nullable instancetype)yy_modelWithJSON:(id)json;
// 模型转NSObject
- (nullable id)yy_modelToJSONObject;
// 模型转NSData
- (nullable NSData *)yy_modelToJSONData;
// 模型转json字符串
- (nullable NSString *)yy_modelToJSONString;
// 模型深拷贝
- (nullable id)yy_modelCopy;
// 判断模型是否相等
- (BOOL)yy_modelIsEqual:(id)model;
// 属性数据映射,用来定义多样化数据时转换声明
+ (nullable NSDictionary<NSString *, id> *)yy_modelCustomPropertyMapper;
// 属性自定义类映射,用来实现自定义类的转换声明
+ (nullable NSDictionary<NSString *, id> *)yy_modelContainerPropertyGenericClass;
// 属性黑名单,该名单属性不转换为model
+ (nullable NSArray<NSString *> *)yy_modelPropertyBlacklist;
// 属性白名单,只有该名单的属性转换为model
+ (nullable NSArray<NSString *> *)yy_modelPropertyWhitelist;
// JSON 转为 Model 完成后,该方法会被调用,返回false该model会被忽略
// 同时可以在该model中做一些,转换不能实现的操作,如NSDate类型转换
- (BOOL)yy_modelCustomTransformFromDictionary:(NSDictionary *)dic;
// Model 转为 JSON 完成后,该方法会被调用,返回false该model会被忽略
// 同时可以在该model中做一些,转换不能实现的操作,如NSDate类型转换
- (BOOL)yy_modelCustomTransformToDictionary:(NSMutableDictionary *)dic

基本的使用方法

数据交换

NSDictionary *dic = @{@"name":@"张三",@"age":@(12),@"sex":@"男"};
// 将数据转模型
YYPersonModel *model = [YYPersonModel yy_modelWithDictionary:dic];
// 将模型转数据
NSDictionary *dics = [model yy_modelToJSONObject];

多样化的数据类型交换

YYModel支持自定义的属性名进行映射,也就是说数据的key和属性名可以是不相同。那么怎么才知道你自定义的属性名对应的是数据的哪个key呢?那就需要对自定义属性的映射进行映射声明。

@interface TestYYModel : NSObject@property (strong, nonatomic) NSNumber *personId;
@property (copy,   nonatomic) NSString *name;
@property (assign, nonatomic) int age;
@property (copy,   nonatomic) NSString *sex;@end

在YYPersonModel.m 重写YYModel的方法yy_modelCustomPropertyMapper,返回设定的映射值,并且YYModel提供多个字段的映射。(笔者本人并未搞懂这里的用法,在YYModel源码中并未找到)

+ (NSDictionary *)yy_modelCustomPropertyMapper {// 将personId映射到key为id的数据字段return @{@"personId":@"id"};// 映射可以设定多个映射字段//  return @{@"personId":@[@"id",@"uid",@"ID"]};
}

最后依然通过像原来的数据那样,直接通过字典的方式进行模型转换,当key为id时,会自动给personId赋值,达到我们需要的效果。

// ViewController.m
NSDictionary *dic = @{@"id":@"123",@"name":@"lisi",@"age":@(20),@"sex":@"man"};TestYYModel *model = [TestYYModel yy_modelWithDictionary:dic];NSLog(@"ID: %@",model.personId);NSDictionary *dics = [model yy_modelToJSONObject];NSLog(@"ID: %@", dics);

自定义属性映射数据交换

YYModel支持多样化的数据类型,甚至字典,数组等数据,如果不存在,则该model会自动设置为null,该例子提出使用NSArray和NSDictionary作为数据,效果依然一样。


@interface TestYYModel : NSObject@property (strong, nonatomic) NSNumber *personId;
@property (copy,   nonatomic) NSString *name;
@property (assign, nonatomic) int age;
@property (copy,   nonatomic) NSString *sex;
@property (strong, nonatomic) NSArray *languages;
@property (strong, nonatomic) NSDictionary *job;@end

在数据中依然可以找到NSArray和NSDictionary和sexDic下的sex字段并转化为模型:

// ViewController.m
NSDictionary *dic = @{@"id":@"123",@"name":@"张三",@"age":@(12),@"sexDic":@{@"sex":@"男"},@"languages":@[@"汉语",@"英语",@"法语"],@"job":@{@"work":@"iOS",@"eveDay":@"10小时",@"site":@"CSDN"}};
YYPersonModel *model = [YYPersonModel yy_modelWithDictionary:dic];

自定义类数据转换(多个model嵌套)

这里我们并不需要做什么,只需要将一个model设置成另一个model的属性就可以了。

// JSON
{"author":{"name":"J.K.Rowling","birthday":"1965-07-31T00:00:00+0000"},"name":"Harry Potter","pages":256
}// Model: 什么都不用做,转换会自动完成
@interface Author : NSObject
@property NSString *name;
@property NSDate *birthday;
@end
@implementation Author
@end@interface Book : NSObject
@property NSString *name;
@property NSUInteger pages;
@property Author *author; //Book 包含 Author 属性
@end
@implementation Book
@end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Fargo】14: sockaddr_in 、 sockaddr 、sockaddr_storage 区别及转换

sockaddr_in 和 sockaddr struct recv_addr_; uv_ip4_addr(ip.c_str(), port, &recv_addr); 这里libuv用的是sockaddr_in ,mediasoup用的是sockaddr,二者有什么区别,可以直接转换么sockaddr 看起来更为通用 差异和特定的用途 在网络编程中,sockaddr_in 和 sockaddr 是…

HarmonyOS ArkTS与C++数据类型转换

1. HarmonyOS ArkTS与C数据类型转换 本文介绍了C与TS各自数据类型与互相之间的数据类型转换&#xff0c;在需要使用C模块时可以快速上手对各种数据类型进行转换。 1.1. 概述 HarmonyOS的主力开发语言是ArkTS&#xff0c;也提供了C语言的支持&#xff0c;对于一些能力&#xff…

react mackDowan 渲染文本,图片,视频

需要安装&#xff1a;react-markdown&#xff1b;remark-gfm "react-markdown": "^9.0.1", "remark-gfm": "^4.0.0", import { useEffect, useState } from react; import ReactMarkdown, { Components } from react-markdown;functio…

iOS_响应者链 Responder Chain

文章目录 简述Hit-Test 机制 &#xff08;找到最佳响应者&#xff09;响应者链 Responder chain应用获取当前View的控制器对象&#xff1a;手势穿透&#xff1a; 简述 传递链&#xff1a; 系统向离用户最近的view传递。 UIKit –> active app’s event queue –> window …

【设计模式系列】迭代器模式(七)

一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中&#xff0c;这样…

纯GO语言开发RTSP流媒体服务器-RTSP推流直播、本地保存录像、录像回放、http-flv及hls协议分发

温馨提示&#xff1a;我们分享的文章是给需要的人&#xff0c;不需要的人请绕过&#xff0c;文明浏览&#xff0c;误恶语伤人&#xff01; 前言 在软件开发中遇到使用流媒体音视频的行业比较多&#xff0c;如安防监控系统、无人机巡逻视频上云处理、直播平台、教育与企业培训…

如何快速使用Cesium完成项目

要快速使用Cesium完成项目&#xff0c;可以按照以下步骤进行&#xff1a; 学习基础知识&#xff1a; 首先&#xff0c;了解Cesium的基本概念和功能。可以通过阅读Cesium的官方文档和一些入门教程来掌握基础知识。例如&#xff0c;可以参考“Cesium速成教程&#xff1a;一小时入…

代码随想录(十二)——图论

并查集 并查集主要有三个功能。 寻找根节点&#xff0c;函数&#xff1a;find(int u)&#xff0c;也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合&#xff0c;函数&#xff1a;join(int u, int v)&#xff0c;将两个节点连在同一个根节点上判断两个节点是否在…

阿里云物联网的通信方式

阿里云物联网通信的两种方式&#xff0c;一个是物模型&#xff08;分为服务&#xff0c;事件&#xff0c;属性&#xff09;&#xff0c;一个是自定义topic&#xff08;要另外设置数据流转&#xff09; 1.使用产品内的功能定义&#xff0c;&#xff08;其实也就是Topic中定义好的…

ubuntu nginx 已经安装 letsencrypt 如何获取免费证书

如果你已经在 Ubuntu 上安装了 Nginx 和 Let’s Encrypt&#xff0c;以下是如何使用 Certbot 获取免费的 SSL 证书的步骤。 1. 安装 Certbot 和 Nginx 插件 即使你已经安装了 Let’s Encrypt&#xff0c;仍然需要安装 Certbot 和其 Nginx 插件来自动处理证书生成和配置。 更…

新手逆向实战三部曲之三——通过进入关键call追码注册软件(进阶)

教程开始&#xff1a; 通过前两次的学习&#xff0c;是不是感觉逆向也蛮有意思的呢&#xff0c;感兴趣的同学可以先看看前二次的内容再继续向下学习 新手逆向实战三部曲之一 新手逆向实战三部曲之二 有了上次爆破的基础&#xff0c;这次便省力了许多&#xff0c;这次从载入开始…

STM32第15章 RCC-使用HSE/HSI配置时钟

时间:2024.10.21-10.23 参考资料: 《零死角玩转STM32》“RCC-使用HSE/HIS配置时钟”章节 TIPS: 从前面的历程中我们知道,程序在启动的时候会执行汇编文件,汇编文件里会调用System_Init(固件库编程的函数),它里面会把时钟初始化成72M,因此前面我们在用固件库写程序的…

数据结构:“小猫钓鱼游戏”

一&#xff1a;题目 栈和队列的综合应用&#xff1a;“小猫钓鱼”的游戏规则是&#xff1a;将一副扑克牌平均分成两份&#xff0c;每人拿一份。玩家甲先拿出手中的第一张扑克牌放在桌上&#xff0c;然后玩家乙也拿出手中的第一张扑克牌&#xff0c;并放在玩家甲刚打出的扑克牌的…

采用Excel作为可视化设计器的开源规则引擎 NopRule

决策树和决策矩阵是业务人员可以直观理解的复杂IF-ELSE逻辑表达形式&#xff0c;也是规则引擎中最常用、最有用的部分。常见的规则引擎如Drools虽然提供了更加丰富的功能特性集&#xff0c; 特别是所谓的RETE算法可以用于高效复用多次重复出现的表达式片段&#xff0c;但在实际…

SpringSecurity + Jwt权限校验,接口调用403 Forbidden问题排查与解决

问题背景&#xff1a;部分接口调用正常&#xff0c;部分接口调用报403Forbidden&#xff0c;postman不显示具体报错信息。 问题描述&#xff1a; 接口调用报错&#xff0c;经排查&#xff0c;权限校验认证通过&#xff0c;可以进入接口&#xff0c;但是在执行过程中&#xff0…

【MySQL】提高篇—视图与存储过程:存储过程(Procedure)的创建与调用

在关系数据库中&#xff0c;存储过程&#xff08;Stored Procedure&#xff09;是一组预编译的 SQL 语句和可选的控制流语句&#xff08;如条件语句和循环语句&#xff09;&#xff0c;它们被存储在数据库中并可以被客户端应用程序或数据库用户调用。存储过程可以接受输入参数&…

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中&#xff0c;xmlns &#xff08;.xml的namespace&#xff09;命名空间是一个非常重要的概念。通过引入不同的命名空间&#xff0c;可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外&#xff0c;还有很多常见的命名空间…

Java 线程池:深入理解与高效应用

在 Java 并发编程中&#xff0c;线程池是一种非常重要的技术。它可以有效地管理和复用线程&#xff0c;提高系统的性能和资源利用率。本文将深入探讨 Java 线程池的概念、原理、使用方法以及最佳实践&#xff0c;帮助读者更好地理解和应用线程池。 一、引言 在现代软件开发中&a…

高级SQL技巧掌握

高级SQL技巧掌握 在数据驱动的时代,掌握SQL不仅仅是为了解决具体问题,它更像是一把钥匙,帮助你打开数据分析的大门。你准备好提升你的SQL技能了吗?在这篇文章中,我们将一起探索十个必备的高级SQL查询技巧,这些技巧将帮助你更有效率地进行数据处理与分析。 1. 常见表表达…

从0到1学习node.js(npm)

文章目录 一、NPM的生产环境与开发环境二、全局安装三、npm安装指定版本的包四、删除包 五、用npm发布一个包六、修改和删除npm包1、修改2、删除 一、NPM的生产环境与开发环境 类型命令补充生产依赖npm i -S uniq-S 等效于 --save -S是默认选项npm i -save uniq包的信息保存在…