【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.rhkb.cn/news/460876.html

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

相关文章

XCode16中c++头文件找不到解决办法

XCode16中新建Framework&#xff0c;写完自己的c代码后&#xff0c;提示“<string> file not found”等诸如此类找不到c头文件的错误。 工程结构如下&#xff1a; App是测试应用&#xff0c;BoostMath是Framework。基本结构可以参考官方demo&#xff1a;Mix Swift and …

开源代码管理平台Gitlab如何本地化部署并实现公网环境远程访问私有仓库

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 本文主要介绍如何在Linux CentOS8 中搭建GitLab私有仓库并且结合内网穿透工具实现在公网…

JavaEE初阶---网络原理(四)--IP协议/DNS协议

文章目录 1.初识网络层&#xff08;了解即可&#xff09;2.地址管理2.1动态分配2.2网络地址转换2.3IP-v6最终解 3.网段划分4.以太网协议--数据链路层5.DNS应用层协议 1.初识网络层&#xff08;了解即可&#xff09; 网络层做的事情就是下面的两个&#xff1a; 1&#xff09;地…

4.2-6 使用Hadoop WebUI

文章目录 1. 查看HDFS集群状态1.1 端口号说明1.2 用主机名访问1.3 主节点状态1.4 用IP地址访问1.5 查看数据节点 2. 操作HDFS文件系统2.1 查看HDFS文件系统2.2 在HDFS上创建目录2.3 上传文件到HDFS2.4 删除HDFS文件和目录 3. 查看YARN集群状态4. 实战总结 1. 查看HDFS集群状态 …

EMS专题 | 5个必须知道的温度监测系统入门知识

在保护温度敏感资产方面&#xff0c;可靠的温度监测技术扮演着至关重要的角色。为了帮助您深入了解这一关键技术&#xff0c;我们特别推出了EMS&#xff08;环境监测系统&#xff09;专题文章系列。内容将由浅入深&#xff0c;从基础原理到实际应用&#xff0c;从行业标准到解决…

代码随想录-字符串-反转字符串中的单词

题目 题解 法一:纯粹为了做出本题&#xff0c;暴力解 没有技巧全是感情 class Solution {public String reverseWords(String s) {//首先去除首尾空格s s.trim();String[] strs s.split("\\s");StringBuilder sb new StringBuilder();//定义一个公共的字符反转…

关于Android Studio Koala Feature Drop | 2024.1.2下载不了插件的解决办法

解决 androidStudio Settings->Plugins下载插件&#xff0c;点击install后没反应&#xff0c;同时插件描述相关显示不出来 第一步&#xff1a; 第二步&#xff1a; 点击设置&#xff0c;勾选Auto-detect proxy settings&#xff0c;输入网址 https://plugins.jetbrains.com…

[论文阅读] Improved Baselines with Visual Instruction Tuning

启发&#xff1a; 1、LLaVA-1.5和LLaVA以及其他大模型相比&#xff0c;做出了哪些改进&#xff1f; &#xff08;1&#xff09;使用CLIP-ViT-L-336px作为视觉编码器&#xff0c;使模型能处理336px的高分辨率图像&#xff0c;这使得模型能从图像中提取出更多细节信息。此外&am…

大语言模型(LLM)快速理解

自2022年&#xff0c;ChatGPT发布之后&#xff0c;大语言模型&#xff08;Large Language Model&#xff09;&#xff0c;简称LLM掀起了一波狂潮。作为学习理解LLM的开始&#xff0c;先来整体理解一下大语言模型。 一、发展历史 大语言模型的发展历史可以追溯到早期的语言模型…

「C/C++」C++标准库之#include<fstream>文件流

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

十六:Python学习笔记-- 爬虫(2)requests 模块详解

目录 安装 requests 模块 基本请求方法 GET 请求 POST 请求 PUT 请求 DELETE 请求 添加请求头&#xff1a; 处理查询参数&#xff1a; 文件上传&#xff1a; 常见响应状态码 访问超时 cookie的查询和设置 查询 Cookies 设置 Cookies 设置爬虫代理 小试牛刀 安装 …

无人机敏捷反制技术算法详解!

一、技术概述 无人机敏捷反制技术算法主要通过对非法入侵的无人机进行快速、精准的探测、识别、干扰和摧毁等操作&#xff0c;从而消除无人机威胁&#xff0c;保障人员和财产安全。这一技术涵盖了多种技术手段&#xff0c;如无线电干扰、激光打击、网捕等&#xff0c;并需要综…

8个最佳iMacros替代方案(2024)

1、前言 iMacros是web自动化、抓取和测试的领先工具&#xff0c;它提供了一个浏览器扩展和桌面工具&#xff0c;可以轻松地自动化你的日常任务&#xff0c;然而&#xff0c;自动化所需的关键功能仅在高级版本中可用&#xff0c;iMacros几乎没有其他缺点。 如图所示&#xff1…

数据库数据恢复—Oracle ASM磁盘组掉线 ,ASM实例无法挂载的数据恢复案例

Oracle数据库数据恢复环境&故障&#xff1a; Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 &#xff0c;ASM实例不能mount。 Oracle数据库故障分析&恢复方案&#xff1a; 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储…

解决电脑突然没有声音

问题描述&#xff1a;电脑突然没有声音了&#xff0c;最近没有怎么动过系统&#xff0c;没有安装或者卸载过什么软件&#xff0c;也没有安装或者卸载过驱动程序&#xff0c;怎么就没有声音了呢&#xff1f; 问题分析&#xff1a;仔细观察&#xff0c;虽然音量按钮那边看不到什…

filebeat+elasticsearch+kibana日志分析

1 默认配置 1.1 filebeat filebeat-7.17.yml,从网关中下载k8s的配置&#xff0c;指定es和kibana的配置 通过kibana查询可以查询到日志了&#xff0c;但此时还不知道具体怎么用。 1.2 kibana 在Discover中创建索引格式&#xff1a;filebeat-*&#xff0c;得到如下图&#xf…

【书生.浦语实战营】——入门岛

【书生.浦语实战营】——入门岛_第一关_Linux基础 任务分布1. 本地vscode远程连接并进行端口映射端口映射What——何为端口映射How——怎么进行端口映射 2. Linux基础命令touch &#xff1a;创建文件mkdir &#xff1a;创建目录cd:进入 退出 目录pwd :确定当前所在目录cat:可以…

Metasploit(MSF)使用

目录 Metasploit简要介绍 主要功能 漏洞利用&#xff1a; Payload 生成&#xff1a; 辅助模块&#xff1a; 后渗透模块&#xff1a; 报告生成&#xff1a; 使用教程以及案例 基础命令使用 生成被控端 命令介绍 kali启动主控端 1.启动以及设置载荷等配置 漏洞检测…

zynq PS端跑Linux响应中断

这篇文章主要是讲述如何在Zynq的PS上跑Linux启动IRQ&#xff0c;环境为vivado2019.1&#xff0c;petalinux2019.1 ubuntu20.04&#xff0c;本人初学者&#xff0c;欢迎批评指正 1. Vivado硬件设计 确保自定义IP的中断信号通过 IRQ_F2P 连接到PS端。在开始Petalinux配置之前&a…

SpringBoot篇(监控)

目录 学习前言 一、什么是监控&#xff1f; 二、监控的意义 1. 简介 2. 总结 3. 思考 三、可视化监控平台 1. 简介 2. 实操 2.1. 服务端开发 2.2. 客户端开发 配置多个客户端 2.3. 总结 2.4. 思考 四、监控原理 1. 简介 2. 总结 五、自定义监控指标 1. 简介…