swift语言Codable 用法及原理详解

Swift语言Codable 用法及原理详解

什么是Codable

Codable是Swift4引入的一个协议,用于将Swift对象与外部数据格式(如JSON)进行相互转换。通过实现Codable协议,我们可以将一个包含各种类型属性的对象编码成JSON字符串或从JSON字符串中解码成Swift对象。通过Codable,我们可以更方便安全地处理数据。

Codable主要包含两个协议

Codable协议是一个复合协议,内容为Encodable和Decodable两个协议,并提供默认的实现,其中Encodable用于编码将值编码到外部表示中,Decodable从外部表示中解码数据生成值。

public typealias Codable = Encodable & Decodable

Codable的使用

我们只需要在swift类中实现Codable协议即可让它支持从JSON中解析和编码成JSON。示例如下:

struct MyModel: Codable {
    var name: String
    var age: Int
    var email: String
}

我们在结构体(或类)前添加了Codable协议,在该结构体(或类中)定义了几个属性。这些属性将自动遵循Codable协议。这样我们就能够方便地编码和解码MyModel对象了。下面演示一下具体的使用方法。

使用示例

编码成JSON字符串

let myModel = MyModel(name: "Swift", age: 4, email: "swift@swift.com")
let jsonData = try JSONEncoder().encode(myModel)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString) 

这里我们新建了一个MyModel对象,并且使用JSONEncoder()将其编码成一个JSON字符串。最终输出的字符串应为:

{"name":"Swift","age":4,"email":"swift@swift.com"}

从JSON字符串解码

let jsonString = "{\"name\":\"Swift\",\"age\":4,\"email\":\"swift@swift.com\"}"
let jsonData = jsonString.data(using: .utf8)!
let myModel = try JSONDecoder().decode(MyModel.self, from: jsonData)

我们将JSON字符串转换成对应的Data类型,然后使用JSONDecoder()将其解码成一个MyModel对象。这里一定要指定要解码的是哪种类型的对象,即调用decode(_:from:)方法时指定类型MyModel.self

注意事项

自定义Key

如果你的对象属性名与JSON字符串中的Key不匹配,那么可以在属性前面加一个CodingKeys枚举,用来定义属性名与JSON字符串Key的对应关系。

struct MyModel: Codable {
    var name: String
    var age: Int
    var email: String

    enum CodingKeys: String, CodingKey {
        case name = "my_name"
        case age = "my_age"
        case email = "my_email"
    }
}

自定义解码与编码

如果你需要现有的解码和编码机制做出一些更改,你可以实现DecodableEncodable协议的方法来进行具体的操作。

struct MyModel: Codable {
    var name: String
    var age: Int
    var email: String

    enum CodingKeys: String, CodingKey {
        case name = "my_name"
        case age = "my_age"
        case email = "my_email"
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        age = try container.decode(Int.self, forKey: .age)
        email = try container.decode(String.self, forKey: .email)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        try container.encode(age, forKey: .age)
        try container.encode(email, forKey: .email)
    }
}

在定义CodingKeys枚举之外还自定义了init(from:)encode(to:)方法,并在这两个方法中手动实现了解码和编码的过程。

总结

Codable是Swift4中我们用来把数据转化成 JSON 与将 JSON 数据解析成对象的一种新的方式。通过实现Codable协议,我们可以更方便地进行数据的编码和解码,并且不需要基础过于高深的网络基础知识。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:swift语言Codable 用法及原理详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • WPA/WPA2无线网络密码破解图文教程

    下面是“WPA/WPA2无线网络密码破解图文教程”的完整攻略,包括两个示例说明。 WPA/WPA2无线网络密码破解图文教程 背景介绍 WPA/WPA2是目前使用最为广泛的无线网络加密方式之一。但是,在某些情况下(比如忘记密码),我们需要破解已经连接的无线网络密码。本文将介绍WPA/WPA2无线网络密码破解的方法。 破解方法 准备工作 首先,我们需要安装一个L…

    C 2023年5月22日
    00
  • C++实现宠物商店信息管理系统

    C++实现宠物商店信息管理系统攻略 1. 系统整体设计 1.1 需求分析 首先,我们需要确定系统的需求,也就是要管理哪些信息。在宠物商店信息管理系统中,通常包含以下信息: 宠物信息:宠物的种类、颜色、年龄等。 宠物商店信息:商店名称、地址、电话等。 顾客信息:顾客的姓名、联系方式等。 订单信息:订单号、顾客信息、宠物信息等。 1.2 设计思路 系统整体设计采…

    C 2023年5月23日
    00
  • C语言有界指针

    C语言有界指针的完整使用攻略 什么是有界指针? 有界指针是C语言中的一种指针,它相对于普通指针有一个明确的指针有效范围,通常用于动态内存分配、数组访问等场景,可以有效避免指针越界操作带来的安全风险。 有界指针的声明与初始化 有界指针的声明方式与普通指针类似,但需要在指针名后面添加_chk后缀,表示这是一种有界指针。 例如定义一个有界指针p,可以使用以下语句:…

    C 2023年5月9日
    00
  • C 输入 & 输出

    下面就为大家介绍一下C语言中的输入输出攻略。 C 输入 & 输出 scanf 函数 scanf 函数用于从标准输入流(stdin)中读取指定格式的数据,并将其存储在指定的内存地址中。其使用方式如下: scanf("%格式控制符", &变量名); 其中,%格式控制符 占位符用于指定读入的变量类型,常用的占位符有: %d 读入…

    C 2023年5月10日
    00
  • C语言实现车票管理系统

    C语言实现车票管理系统攻略 系统简介 本项目旨在通过使用C语言实现一个简单的车票管理系统,包含票务查询、购票、售票等功能,并能够通过简单的文件操作来实现信息的存储和读取。 系统设计 数据结构 本系统的重要数据结构包括车次、日期、座位号、顾客信息等。 车次包括列车编号、起始站和终点站,同一天内可以有多条相同的车次。 日期包括年、月、日,组成日期的整型和字符串等…

    C 2023年5月22日
    00
  • C#程序异常关闭时的捕获

    C#程序在运行过程中,有时难免会出现一些异常情况,如空指针异常、数组越界等。这些异常往往会导致程序崩溃,给用户带来不好的使用体验。为了避免这种情况的发生,可以在程序中加入异常处理机制,捕获程序运行时可能出现的异常,从而避免程序崩溃而造成不必要的损失。 下面介绍C#程序异常关闭时的捕获的完整攻略。 1. 异常处理机制的基本原理 当程序发生异常时,实际上是在抛出…

    C 2023年5月23日
    00
  • matlab遗传算法求解车间调度问题分析及实现源码

    Matlab遗传算法求解车间调度问题分析及实现源码 问题分析 车间调度问题是指在车间内有多台设备需要完成不同的作业任务,每个设备对应一定数量的作业任务,而作业任务需要按照规定完成时间完成。车间调度问题的目标是对各个设备所对应的作业任务进行优化排序,使得整个车间任务的完成时间最短。 遗传算法 遗传算法是一种基于生物学进化思想的问题求解方法,它通过模拟物种进化过…

    C 2023年5月22日
    00
  • C/C++新建注册表项的代码示例

    下面我来给你详细讲解如何在C/C++中创建和修改Windows系统的注册表项。 首先,可以使用WinAPI提供的Registry相关函数来实现对注册表项进行增删改查操作。需要注意的是,这些函数在使用时需要管理员权限。 新建注册表项 要新建一个注册表项,可以使用RegCreateKeyEx函数。该函数有以下几个参数: HKEY hKey:表示注册表项的父节点。…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部