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语言中字符串的strlen()和sizeof()的区别

    C语言中,字符串是由若干个字符组成的序列,以’\0’结尾。C语言提供了许多字符串相关的函数,其中两个常用的函数是strlen()和sizeof()函数。本文将会详细讲解这两个函数的用法和区别。 1. strlen()函数 strlen()函数是C语言中标准库函数,用于计算给定的字符串的长度(不包含结尾的’\0’)。 其函数原型如下: size_t strle…

    C 2023年5月10日
    00
  • C++OOP对象和类的详细讲解

    C++OOP对象和类的详细讲解 什么是对象和类? 在C++中,对象是指一个特定类的实例,其定义中包含了类的数据成员和函数成员。类是一种用户自定义的数据类型,可以定义包括数据成员和函数成员在内的各种内容,表示某一类似真实世界中的实体。 如何定义类和对象? 定义一个类,需要使用class关键字,紧接着是类名和一对大括号,“{}”内部定义类的数据成员和函数成员。 …

    C 2023年5月22日
    00
  • windows10开始菜单失灵及异常的解决方法

    Windows 10开始菜单失灵及异常的解决方法 在Windows 10系统中,开始菜单是一项非常重要的功能。但是,有时候可能会出现开始菜单失灵或异常等问题,这会影响我们的使用体验。下面是解决这些问题的一些方法。 方法一:重新启动Windows Explorer 右键点击任务栏,选择“任务管理器”。 找到“Windows Explorer”进程,右键点击并选…

    C 2023年5月23日
    00
  • C语言和go语言之间的交互操作方法

    C语言和Go语言是两种不同的编程语言,它们在程序的实现上也存在一些差异。但是,由于它们在不同的应用场景下产生了巨大的价值,所以在很多时候是需要将这两种语言进行交互的。那么,如何实现C语言和Go语言的交互呢?下面是一个完整的攻略。 一、Go与C交互的基本方法 Go和C使用的是不同的编译器和标准库,因此它们之间的交互需要一些特殊的技巧。 首先,我们需要了解在Go…

    C 2023年5月23日
    00
  • python中的decimal类型转换实例详解

    下面就为大家详细讲解“Python中的decimal类型转换实例详解”的完整攻略。 概述 Python中的decimal类型是用于精确计算的浮点数,可以解决常规浮点数运算产生的误差问题。而在进行decimal类型的转换过程中,需要注意其精度和舍入模式等因素。 基本用法 创建decimal类型 要创建decimal类型,需要调用decimal模块中的Decim…

    C 2023年5月22日
    00
  • 实例解析js中try、catch、finally的执行规则

    下面是详细讲解“实例解析js中try、catch、finally的执行规则”的攻略。 一、try、catch、finally的基本概念 在JavaScript中,有时我们需要捕获程序执行中的异常信息,同时在出现异常时进行后续处理。这时候我们就需要用到try、catch和finally语句。 try块用于捕获可能引发异常的代码块。 catch块用于处理try块…

    C 2023年5月23日
    00
  • C语言实现车辆信息管理系统

    C语言实现车辆信息管理系统攻略 1. 系统需求分析 在实现车辆信息管理系统之前,我们需要对系统进行需求分析,明确系统所需要实现的功能和对应的数据结构。下面是该系统的功能描述和数据结构设计: 功能描述 添加车辆信息 删除车辆信息 修改车辆信息 查询车辆信息 显示所有车辆信息 数据结构设计 车辆信息包括以下属性: 车牌号 车型 车主姓名 车主电话 因此,我们可以…

    C 2023年5月23日
    00
  • 推箱子游戏C语言实现代码

    推箱子游戏是一款古老而经典的智力游戏,在这里我将详细讲解如何使用C语言实现这个游戏。以下是实现过程的完整攻略: 设计概述 在实现前,我们需要进行一些设计工作。推箱子游戏可以被看作是一个二维迷宫,我们需要设计一个二维数组来表示地图。数组元素可以是空地、墙壁、箱子或目标点。我们可以使用数字来表示不同的元素,例如0表示空地、1表示墙壁、2表示箱子、3表示目标点。我…

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