使用 Codable 归档 Swift 对象

开发 前端
UserDefaults非常适合存储简单的设置,例如整数和布尔值,但是当涉及复杂数据时——例如自定义Swift类型——我们需要做更多的工作。

[[412119]]

UserDefaults非常适合存储简单的设置,例如整数和布尔值,但是当涉及复杂数据时——例如自定义Swift类型——我们需要做更多的工作。

我们可以使用以下简单的User数据结构:

  1. struct User { 
  2.     var firstName: String 
  3.     var lastName: String 

它有两个字符串,但并不特殊——它们只是一段文本。整数,布尔值(真或假)和Double也是如此。这些值的数组和字典也很容易想到:一个字符串,然后是另一个,然后是第三个,依此类推。

当使用这样的数据时,Swift为我们提供了一个很棒的协议,称为Codable:一种专门用于存档和取消存档数据的协议,这是一种“将对象转换为纯文本然后再次转换”的奇特方式。

我们将在未来的项目中更多地研究Codable,但是目前我们的需求很简单:我们想要归档一个自定义类型,以便可以将其放入UserDefaults中,然后在从UserDefaults中返回时将其取消存档。

当使用仅具有简单属性的类型(字符串,整数,布尔值,字符串数组等)时,支持归档和取消归档的唯一需要做的就是向Codable添加一致性,如下所示:

  1. struct User: Codable { 
  2.     var firstName: String 
  3.     var lastName: String 

Swift将自动为我们生成一些代码,这些代码将根据需要为我们存档和取消存档User实例,但是我们仍然需要告诉Swift何时存档以及如何处理数据。

该过程的这一部分由称为JSONEncoder的新类型提供支持。它的工作是获取符合Codable的内容,然后以 JavaScript Object Notation(JSON)的形式发送回该对象。该名称暗示它特定于JavaScript,但实际上,我们都使用它,因为它是如此的快速和简单。

Codable协议不需要我们使用JSON,实际上可以使用其他格式,但这是迄今为止最常见的格式。在这种情况下,我们实际上并不在乎使用哪种数据,因为它们只会存储在UserDefaults中。

要将用户数据转换为JSON数据,我们需要在JSONEncoder上调用encode()方法。这可能会引发错误,因此应使用try或try?进行调用来整齐地处理错误。例如,如果我们有一个属性来存储User实例,如下所示:

  1. @State private var user = User(firstName: "Taylor", lastName: "Swift"

然后,我们可以创建一个将用户存档的按钮,并将其保存到UserDefaults中,如下所示:

  1. Button("Save User") { 
  2.     let encoder = JSONEncoder() 
  3.  
  4.     if let data = try? encoder.encode(self.user) { 
  5.         UserDefaults.standard.set(data, forKey: "UserData"
  6.     } 

该数据常量是一种新的数据类型,可能会让人感到困惑。它旨在存储您可以想到的任何类型的数据,例如字符串,图像,zip文件等。不过,在这里,我们只关心它是可以直接写入UserDefaults中的数据类型之一。

当我们返回另一种方式时(当我们拥有JSON数据并且想要将其转换为Swift Codable类型时),我们应该使用JSONDecoder而不是JSONEncoder,但是过程大致相同。

这使我们进入了项目概述的末尾,因此继续进行,将您的项目重置为其初始状态,以便进行构建。

本文转载自微信公众号「Swift社区」,可以通过以下二维码关注。转载本文请联系Swift社区公众号。

 

责任编辑:姜华 来源: Swift社区
相关推荐

2011-08-11 17:15:54

iPhone归档

2012-07-12 16:00:32

OpenStackSwift架构

2021-10-22 14:23:02

logrotateLinux 命令Linux

2010-04-02 15:25:40

云归档

2017-09-25 14:22:26

Swift4.0正式发布添加归档

2015-03-16 10:33:14

Swift指针

2015-01-21 16:25:29

Swift指针

2011-08-02 11:16:08

Oracle数据库归档日志

2015-08-27 09:46:09

swiftAFNetworkin

2015-08-25 11:17:13

OpenStack对象存储Swift

2015-08-27 09:46:02

开源对象存储Swift

2013-07-25 09:12:48

OpenStackSwift对象存储对象存储

2014-07-02 09:47:06

SwiftCocoaPods

2022-08-10 09:02:08

SwiftDecodable

2022-04-10 12:24:50

LinuxArk归档工具

2011-08-01 13:28:09

Oracle归档模式非归档模式

2021-09-02 12:07:48

Swift 监听系统Promise

2014-08-01 15:16:05

SwiftC语言

2015-10-13 10:00:58

Swift随机数使用总结

2021-12-14 09:00:42

Swift HTTP 代理服务器
点赞
收藏

51CTO技术栈公众号