使用Codable归档Swift对象
UserDefaults
非常适合存储简单的设置,例如整数和布尔值,但是当涉及复杂数据时——例如自定义Swift类型——我们需要做更多的工作。
我们可以使用以下简单的User
数据结构:
struct User {
var firstName: String
var lastName: String
}
它有两个字符串,但并不特殊——它们只是一段文本。整数,布尔值(真或假)和
Double
也是如此。这些值的数组和字典也很容易想到:一个字符串,然后是另一个,然后是第三个,依此类推。当使用这样的数据时,Swift为我们提供了一个很棒的协议,称为
Codable
:一种专门用于存档和取消存档数据的协议,这是一种“将对象转换为纯文本然后再次转换”的奇特方式。我们将在未来的项目中更多地研究
Codable
,但是目前我们的需求很简单:我们想要归档一个自定义类型,以便可以将其放入UserDefaults
中,然后在从UserDefaults
中返回时将其取消存档。当使用仅具有简单属性的类型(字符串,整数,布尔值,字符串数组等)时,支持归档和取消归档的唯一需要做的就是向
Codable
添加一致性,如下所示:struct User: Codable {
var firstName: String
var lastName: String
}
Swift将自动为我们生成一些代码,这些代码将根据需要为我们存档和取消存档
User
实例,但是我们仍然需要告诉Swift何时存档以及如何处理数据。【使用Codable归档Swift对象】该过程的这一部分由称为
JSONEncoder
的新类型提供支持。它的工作是获取符合Codable
的内容,然后以 JavaScript Object Notation(JSON)的形式发送回该对象。该名称暗示它特定于JavaScript,但实际上,我们都使用它,因为它是如此的快速和简单。Codable
协议不需要我们使用JSON,实际上可以使用其他格式,但这是迄今为止最常见的格式。在这种情况下,我们实际上并不在乎使用哪种数据,因为它们只会存储在UserDefaults
中。要将用户数据转换为JSON数据,我们需要在
JSONEncoder
上调用encode()
方法。这可能会引发错误,因此应使用try
或try?
进行调用来整齐地处理错误。例如,如果我们有一个属性来存储User
实例,如下所示:@State private var user = User(firstName: "Taylor", lastName: "Swift")
然后,我们可以创建一个将用户存档的按钮,并将其保存到
UserDefaults
中,如下所示:Button("Save User") {
let encoder = JSONEncoder()if let data = https://www.it610.com/article/try? encoder.encode(self.user) {
UserDefaults.standard.set(data, forKey:"UserData")
}
}
该数据常量是一种新的数据类型,可能会让人感到困惑。它旨在存储您可以想到的任何类型的数据,例如字符串,图像,zip文件等。不过,在这里,我们只关心它是可以直接写入
UserDefaults
中的数据类型之一。当我们返回另一种方式时(当我们拥有JSON数据并且想要将其转换为Swift Codable类型时),我们应该使用
JSONDecoder
而不是JSONEncoder
,但是过程大致相同。这使我们进入了项目概述的末尾,因此继续进行,将您的项目重置为其初始状态,以便进行构建。
译自 Archiving Swift objects with Codable相关内容可以参考:
Swift:处理多级Codable数据
Swift:缓存Codable数据
SwiftUI:使用UserDefaults存储用户设置 | Hacking with iOS: SwiftUI Edition | iExpense 项目 |
---|
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小