Swift使用编解码库Codable的过程详解

 更新时间:2023年09月12日 11:06:39   作者:培根芝士  
Codable 是 Swift 引入的全新的编解码库,使开发者更方便的解析JSON 或 plist 文件,支持枚举、结构体和类,这篇文章主要介绍了Swift使用编解码库Codable,需要的朋友可以参考下

Codable 是 Swift 引入的全新的编解码库,使开发者更方便的解析JSON 或 plist 文件。支持枚举、结构体和类。

Codable协议定义

Codable代表一个同时符合 Decodable 和 Encodable 协议的类型,即可解码且可编码的类型。

typealias Codable = Decodable & Encodable
public protocol Decodable {
    public init(from decoder: Decoder) throws
}
public protocol Encodable {
    public func encode(to encoder: Encoder) throws
}

Codable从 Swift 4 开始引入,包含了 Encoder 和 Decoder 协议和他们的两个实现 JSONEncoder、JSONDecoder 和 PropertyListEncoder、PropertyListDecoder。

其中 Codable 及其相关协议放在了标准库中,而具体的 Encoder、Decoder 类放在了 Foundation 框架中。 

JSON 和 模型的相互转换

苹果提供了  JSONEncoder  和  JSONDecoder  这两个结构体来方便得在 JSON 数据和自定义模型之间互相转换。苹果可以利用一些系统私有的机制来实现转换,而不需要通过  OC Runtime

只要让自己的数据类型符合 Codable 协议,就可以用系统提供的编解码器进行编解码。

struct User: Codable {
    var name: String
    var age: Int
}

解码(JSON Data -> Model):

let user = JSONDecoder().decode(User.self, from: jsonData)

编码(Model -> JSON Data):

let jsonData = JSONEncoder().encode(user)

字典 和 模型的相互转换

将模型用JSONEncoder的encode转成Data,然后再用JSONSerialization反序列化成Dictionary对象。

struct User: Codable {
    var name: String?
    var age: Int?
    static func convertFromDict(dict: NSDictionary) -> User? {
        var user: User?
        do {
            let data = try JSONSerialization.data(withJSONObject: dict, options: [])
            let decoder = JSONDecoder()
            user = try decoder.decode(User.self, from: data)
        } catch {
            print(error)
        }
        return user
    }
    func convertToDict() -> NSDictionary? {
        var dict: NSDictionary?
        do {
            let encoder = JSONEncoder()
            let data = try encoder.encode(self)
            dict = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary
        } catch {
            print(error)
        }
        return dict
    }
}

到此这篇关于Swift使用编解码库Codable的文章就介绍到这了,更多相关Swift编解码库Codable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Swift 结构体

    详解Swift 结构体

    这篇文章主要介绍了Swift 结构体的相关资料,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-09-09
  • 详解Swift中enum枚举类型的用法

    详解Swift中enum枚举类型的用法

    Swift中通过enum关键字可以直接创建出枚举对象,而且可以使用switch和case语句来进行流程控制,十分强大和灵活,这里我们就来详解Swift中enum枚举类型的用法
    2016-06-06
  • iOS Swift UICollectionView横向分页滚动,cell左右排版问题详解

    iOS Swift UICollectionView横向分页滚动,cell左右排版问题详解

    UICollectionView是iOS中比较常见的一个控件,这篇文章主要给大家介绍了关于iOS Swift UICollectionView横向分页滚动,cell左右排版问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随小编来一起学习学习吧。
    2017-12-12
  • swift自定义表格控件(UITableView)

    swift自定义表格控件(UITableView)

    这篇文章主要为大家详细介绍了swift自定义表格控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Swift自定义UITableViewCell背景色

    Swift自定义UITableViewCell背景色

    这篇文章主要为大家详细介绍了Swift自定义UITableViewCell背景色,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 使用Swift实现iOScollectionView广告无限滚动效果(DEMO)

    使用Swift实现iOScollectionView广告无限滚动效果(DEMO)

    本文给大家分享使用Swift实现iOScollectionView广告无限滚动效果(DEMO),非常不错,具有一定的参考借鉴价值,感兴趣的朋友一起看看吧
    2016-11-11
  • swift3.0键盘弹起遮挡输入框问题的解决方案

    swift3.0键盘弹起遮挡输入框问题的解决方案

    这篇文章主要介绍了swift3.0键盘弹起遮挡输入框问题的解决方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • Swift编程中的初始化与反初始化完全讲解

    Swift编程中的初始化与反初始化完全讲解

    这篇文章主要介绍了Swift编程中的初始化与反初始化完全讲解,是Swift入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • Swift操作Quartz 2D进行简单的绘图与坐标变换的教程

    Swift操作Quartz 2D进行简单的绘图与坐标变换的教程

    这篇文章主要介绍了Swift操作Quartz 2D进行简单的绘图与坐标变换的教程,Quartz 2D是Core Graphics框架中的一个重要组件,经常被Mac OS或和iOS开发者用来绘图,需要的朋友可以参考下
    2016-04-04
  • Swift利用CoreData如何存储多种数据类的通讯录

    Swift利用CoreData如何存储多种数据类的通讯录

    这篇文章主要给大家介绍了关于Swift利用CoreData如何存储多种数据类的通讯录的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-12-12

最新评论