Swift 基于Codable协议使用

Codable协议 继承自 Decodable & Encodable

//
// Test1.swift
// TestDemo
//
// Created by admin on 2024/7/9.
//

import Foundationstruct Player{var name:Stringvar highScore:Int = 0var history:[Int] = []var address:Address?var birthday:Date?init(name: String) {self.name = name}}extension Player{mutating func updateScore(_ newScore:Int){history.append(newScore)if(highScore < newScore){highScore = newScore}}
}

//Codable 继承自 Decodable & Encodable
/*

Codable 是 Swift 中用于简化对象序列化和反序列化的协议组合。它由 Encodable 和 Decodable 组成,分别用于将对象编码为外部表示(如 JSON)和从外部表示解码对象。通过实现 Codable,我们可以轻松地将自定义类型与 JSON 等格式进行转换。

*/

extension Player:Codable{/*如果 JSON 中的键与结构体中的属性名称不一致,可以使用 CodingKeys 枚举来定义自定义的键映射*/enum CodingKeys:String,CodingKey{case namecase highScorecase addresscase birthdaycase history = "history1"}
}

/*
Codable 同样适用于嵌套类型
*/

struct Address:Codable{var street:Stringvar citty:Stringvar zipCode:String
}
func test111(){var player = Player(name: "John")player.address = Address(street: "宝田一路", citty: "深圳", zipCode: "2212")player.birthday = Date(timeIntervalSince1970: 25 * 365 * 24 * 60 * 60)player.updateScore(121)player.updateScore(134)/*默认情况下,JSONEncoder 和 JSONDecoder 对日期的处理方式可能不符合需求,可以自定义日期格式*/let formatter = DateFormatter()formatter.dateFormat = "yyyy-MM-dd"let encoder = JSONEncoder()encoder.dateEncodingStrategy = .formatted(formatter)let jsonData = try? encoder.encode(player)guard let jsonData = jsonData else{print("json data is nil")return}let jsonStr = String(data: jsonData, encoding: .utf8)guard let jsonStr = jsonStr else{print("json 数据编码失败")return}print("player 转json 字符串 : " + jsonStr)let decoder = JSONDecoder()decoder.dateDecodingStrategy = .formatted(formatter)guard let jsonDataDe = jsonStr.data(using: .utf8) else {print("json DataDe is null")return}//解码异常处理和打印var user :Player?do {user = try decoder.decode(Player.self, from: jsonDataDe)} catch let DecodingError.dataCorrupted(context) {print(context)} catch let DecodingError.keyNotFound(key, context) {print("Key '\(key)' not found:", context.debugDescription)print("codingPath:", context.codingPath)} catch let DecodingError.valueNotFound(value, context) {print("Value '\(value)' not found:", context.debugDescription)print("codingPath:", context.codingPath)} catch let DecodingError.typeMismatch(type, context)  {print("Type '\(type)' mismatch:", context.debugDescription)print("codingPath:", context.codingPath)} catch {print("Error: ", error)}guard let user = user else{print("user is null")return}print("name:" + user.name + ",score:" + "\(user.highScore)")}

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

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

相关文章

uniapp进行微信小程序开发,使用navigateBack返回到上一个页面时候,接口未刷新。

代码背景&#xff1a; 使用uniapp进行微信小程序开发时&#xff0c;有a和b两个页面&#xff0c;从a进入b页面后&#xff0c;通过uni.navigateBack()方法返回a页面时候&#xff0c;无法触发a页面的onShow函数里面的接口调用。 解决思路 uniapp官网页面通信 1.通过EventChann…

【JavaScript脚本宇宙】浏览器特性尽在掌握:JavaScript工具库全面解析

提升网页质量&#xff1a;六款神奇JavaScript工具库解析 前言 随着移动设备和互联网的普及&#xff0c;用户使用不同的设备、操作系统和浏览器来访问网页已成为常态。为了更好地适应不同环境下的用户体验需求&#xff0c;开发人员需要使用工具库来识别客户端的特征信息。本文…

Java数值操作

文章目录 1.数值数据类型和操作1.1 数值类型1.2 从键盘读取数值1.3 数值操作符 2.数值型字面值2.1 整形字面值2.2 浮点型字面值2.3 科学记数法 示例&#xff1a;显示当前时间3.增强赋值运算符4.自增和自减操作符5.数值类型转换 1.数值数据类型和操作 1.1 数值类型 类型名范围…

什么是面向对象编程

什么是面向对象编程&#xff1f;&#xff08;OOP&#xff09; ● 面向对象编程是一种基于对象概念的编程范式&#xff1b;&#xff08;所谓的编程范式&#xff0c;就是代码风格&#xff0c;我们“如何”编写和组织代码&#xff09;&#xff1b; ● 我们使用对象来模拟&#xf…

【Cesium开发实战】飞行漫游功能的实现,可设置漫游路径,漫游高度,暂停,继续,删除路径

Cesium有很多很强大的功能&#xff0c;可以在地球上实现很多炫酷的3D效果。今天给大家分享一个可自定义的漫游飞行功能。 1.话不多说&#xff0c;先展示 漫游 2.设计思路 项目需求&#xff0c;可自定义漫游路径&#xff0c;并且设置高度&#xff0c;暂停&#xff0c;继续&…

如何制作文件的二维码?支持设置文件下载功能

现在为了能够更快的将文件分享给其他人查看&#xff0c;会选择将文件转换二维码的方式&#xff0c;用户可以通过扫描二维码在手机上预览或者下载文件到本地&#xff0c;能够有效的减少文件对内存的占用&#xff0c;在很多场景下都有所应用&#xff0c;那么文件转二维码具体该怎…

TCP/IP模型和OSI模型的区别(面试题)

OSI模型&#xff0c;是国际标准化组织ISO制定的用于计算机或通讯系统间互联的标准化体系&#xff0c;主要分为7个层级&#xff1a; 物理层数据链路层网络层传输层会话层表示层应用层 虽然OSI模型在理论上更全面&#xff0c;但是在实际网络通讯中&#xff0c;TCP/IP模型更加实…

LabVIEW电子水泵性能测试平台

开发了一种车用电子水泵性能测试平台&#xff0c;该平台以工控机为载体&#xff0c;利用LabVIEW开发上位机软件&#xff0c;采用PLC控制阀门和水泵等电气元件&#xff0c;通过RS485进行数据采集并传输到上位机。通过上位机与下位机的协同控制&#xff0c;实现了数据交互处理和性…

LeetCode题练习与总结:寻找旋转排序数组中的最小值Ⅱ--154

一、题目描述 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,4]若旋转 …

基于Java Web的考编论坛网站的设计与实现+lw+源码+讲解+调试+视频演示

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料&#xff0c;分析人员可以根据这些信息确定出本系统具备的功能&#xff0c;分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作&#xff0c;但…

聚鼎贸易:装饰画生意能不能做起来2024

在2024年&#xff0c;随着人们对家居美学和个性化表达的需求日益增长&#xff0c;装饰画作为一种简单而直接的方式&#xff0c;来提升空间品味及展示个人风格的市场需求也随之扩大。许多人都对涉足这一行业抱有浓厚的兴趣&#xff0c;但究竟这门生意能否成功做大&#xff0c;需…

Unity 资源 之 战斗魔法咒语 - 第二卷(Combat Magic Spells - Volume II)

&#x1f389;Unity Asset Store 宝藏免费资源&#xff1a;战斗魔法咒语 - 第二卷 前言资源包内容领取兑换码 前言 各位游戏开发爱好者、Unity 开发者们&#xff0c;今天要给大家带来一个超棒的消息&#xff01;在 Unity Asset Store 上&#xff0c;全新的免费资源“战斗魔法咒…

Java高级重点知识点-27-Java反射机制

文章目录 Java反射机制概述理解Class类并获取Class的实例Class 类 类的加载与ClassLoader类加载过程类的初始化触发条件类加载器的作用ClassLoader 创建运行时类的对象获取运行时类的完整结构调用运行时类的指定结构反射的应用&#xff1a;动态代理Proxy类AOP&#xff08;Aspec…

JavaWeb系列二十一: 数据交换和异步请求(JSON, Ajax)

文章目录 官方文档official documents官方文件官方文件official documentsJSON介绍JSON快速入门JSON对象和字符串对象转换应用案例注意事项和细节 JSON在java中使用说明JSON在Java中应用场景应用实例 Ajax基本介绍Ajax是什么Ajax经典应用场景 Ajax原理示意图传统的web应用Ajax原…

Vue3打包发布,刷新出现的空白页面和错误

Vue3打包发布出现的错误&#xff1a;Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of text/html. Strict MIME type checking is enforced for module scripts per HTML spec. 第一次点击访问到这个路径&…

粉笔推出国内首个职教行业大模型,助力学员高效学习

7月12日&#xff0c;粉笔正式推出其自主研发的首个专注于职教行业的垂域大模型&#xff0c;并将于8月1日上线粉笔AI老师 “粉笔头”&#xff0c;为学员提供个性化、智能化的辅导服务。 在垂域大模型的基础上&#xff0c;粉笔结合10年来的教研积累、独有数据搭建RAG系统&#x…

java上手

java上手 文章目录 java上手0.注释1.简单的输出2.从控制台读取输入3.标识符4.变量5.赋值6.常量7.命名习惯 0.注释 // 单行注释 /*多行注释*/ /**对类和方法进行说明*/1.简单的输出 public class HelloWorld{public static void main(String[] args){System.out.println("…

使用MAVSDK向PX4模拟器发送启飞与降落指令

1.使用docker启动PX4模拟器 docker run --rm -it jonasvautherin/px4-gazebo-headless:1.14.3 开始启动 启动中 PX4启动成功 创建QGC连接 mavlink start -p -u 14556 -t 192.168.1.66 -o 14550 启动QGC连接PX4模拟器 在QGC中执行各种指令

TensorFlow系列:第五讲:移动端部署模型

项目地址&#xff1a;https://github.com/LionJackson/imageClassification Flutter项目地址&#xff1a;https://github.com/LionJackson/flutter_image 一. 模型转换 编写tflite模型工具类&#xff1a; import osimport PIL import tensorflow as tf import keras import …

电子画册制作全攻略,从零开始制作

在这个数字化时代&#xff0c;电子画册作为一种新型的传播媒介&#xff0c;已经越来越受到人们的青睐。它以生动活泼、互动性强、传播速度快等特点&#xff0c;迅速成为了企业宣传、个人展示的优质选择。那么&#xff0c;如何从零开始制作一款引人入胜的电子画册呢&#xff1f;…