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日

相关文章

  • C语言实现简单推箱子游戏

    C语言实现简单推箱子游戏攻略 游戏概述 推箱子游戏是一款非常经典的智力益智游戏,玩家需要控制箱子的移动,将箱子全部移动到指定位置即可获胜。在本文中,我们将使用C语言来实现一个简单的推箱子游戏。 游戏规则 游戏地图上有若干个箱子和若干个目标点。 箱子只能水平或垂直移动,不能斜着移动。 箱子不能移动到墙上,也不能推到其他的箱子或目标点上。 箱子被推到目标点上后,…

    C 2023年5月22日
    00
  • google c++程序测试框架googletest使用教程详解

    Google C++程序测试框架Googletest使用教程详解 什么是Googletest? Googletest是Google开源的C++单元测试框架。它旨在帮助编写更好的C++单元测试,而且是免费的。 Googletest的安装 Linux/Unix系统 从源码安装 wget https://github.com/google/googletest/a…

    C 2023年5月23日
    00
  • C语言实现简单学生信息管理系统

    C语言实现简单学生信息管理系统 概述 学生信息管理系统是一个常见的小型项目,可以通过C语言进行实现。本文将介绍如何使用C语言实现一个简单的学生信息管理系统。 功能要求 学生信息管理系统应该具备以下功能:1. 添加学生信息2. 修改学生信息3. 删除学生信息4. 打印学生信息5. 退出系统 基本思路 我们可以通过定义一个结构体来表示一个学生的相关信息,然后将多…

    C 2023年5月23日
    00
  • 如何在C++类的外部调用类的私有方法

    在C++中,私有成员(包括方法和属性)只能通过类的内部访问,不能在类的外部直接访问。但是,在某些情况下,我们可能需要在类的外部访问类的私有方法,如何实现呢?下面是具体的步骤: 步骤1:使用友元函数 在C++中,可以使用友元来访问类的私有成员。友元函数是在类的外部定义,但具有访问类的私有成员的权限。如果将一个外部函数声明为类的友元函数,则该函数将能够访问该类的…

    C 2023年5月23日
    00
  • Django Rest framework之认证的实现代码

    下面我为您详细讲解Django Rest Framework(DRF)中实现认证的代码攻略。 1、DRF认证方式 DRF提供了多种认证方式,包括: BasicAuthentication:HTTP的基本认证方式,不安全,适用于内部系统或测试环境; TokenAuthentication:使用token实现的认证方式,适用于前后端分离项目; SessionAu…

    C 2023年5月23日
    00
  • C语言代码实现点餐系统

    实现点餐系统的完整攻略 1. 确定系统需求 在实现点餐系统之前,首先需要明确系统的需求:用户可以看到菜单列表并选择自己想要的食品,可以查看已选订单并提交订单。在此基础上,可以添加一些特殊功能,如显示菜品图片、价格计算、下单时间控制等等。 2. 设计菜单和订单数据结构 在 C 语言中,常用的数据结构是结构体(struct)。我们可以定义两个结构体,一个代表菜单…

    C 2023年5月23日
    00
  • Python3 JSON 数据解析及日期和时间小结

    Python3 JSON 数据解析及日期和时间小结 JSON 数据解析 JSON 是什么? JSON(JavaScript Object Notation)是一种轻量级数据交换格式,通常用于客户端和服务器之间的数据交互。与 XML 不同,JSON 的语法简洁明了,易于读写和理解。 JSON 数据格式由两种数据结构组成: 键值对,以逗号分隔 大括号括起来的对象…

    C 2023年5月23日
    00
  • 威联通301W路由器怎么样? 威联通301W拆机测评

    威联通301W路由器测评攻略 介绍 威联通301W是一款智能路由器,拥有多种配置选项和广泛的应用功能。本篇文章将从拆机、性能、易用性等多个方面对该路由器进行测评,为大家提供详细介绍。 拆机 首先,我们需要打开威联通301W路由器的外壳,了解内部构造。拆机步骤如下: 用螺丝刀将底部五颗螺丝去除 待底部外壳拆除后,用螺丝刀将顶部四颗螺丝去除 拆下顶部外壳,就可以…

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