当前位置: 首页 > 科技观察

使用Codable归档Swift对象

时间:2023-03-16 10:20:56 科技观察

UserDefaults非常适合存储简单的设置,例如整数和布尔值,但是当涉及到复杂数据时——例如自定义Swift类型——我们需要做更多的工作。我们可以使用以下简单的用户数据结构:structUser{varfirstName:StringvarlastName:String}它有两个字符串,但它们并不特殊——它们只是一段文本。整数、布尔值(真或假)和双精度数也是如此。这些值的数组和字典也很容易想到:一个字符串,然后是另一个,然后是第三个,依此类推。当处理这样的数据时,Swift为我们提供了一个很棒的协议,称为Codable:一个专门用于归档和取消归档数据的协议,这是一种“将对象转换为纯文本并再次转换回来”的特殊方式。我们将在未来的项目中更多地关注Codable,但现在我们的需求很简单:我们想要归档一个自定义类型,以便我们可以将其放入UserDefaults中,然后在从UserDefaults返回时取消归档。当使用仅具有简单属性(字符串、整数、布尔值、字符串数组等)的类型时,支持归档和取消归档唯一需要做的就是添加对Codable的一致性,如下所示:structUser:Codable{varfirstName:StringvarlastName:String}Swift会自动为我们生成一些代码,根据需要为我们归档和取消归档User实例,但我们仍然需要告诉Swift何时归档以及如何处理数据。这部分流程由一种名为JSONEncoder的新类型提供支持。它的工作是获取符合Codable的内容,然后将该对象作为JavaScript对象表示法(JSON)发回。顾名思义,它是特定于JavaScript的,但实际上,我们都在使用它,因为它是如此快速和简单。Codable协议不要求我们使用JSON,实际上可以使用其他格式,但这是迄今为止最常见的。在这种情况下,我们并不真正关心使用何种数据,因为它们将仅存储在UserDefaults中。要将用户数据转换为JSON数据,我们需要调用JSONEncoder的encode()方法。这可能会引发错误,因此应该使用try或try?整齐地处理错误。例如,如果我们有一个属性来存储这样的用户实例:@Stateprivatevaruser=User(firstName:"Taylor",lastName:"Swift")那么我们可以创建一个按钮来存档用户并将其保存到InUserDefaults中,如如下:Button("SaveUser"){letencoder=JSONEncoder()ifletdata=try?encoder.encode(self.user){UserDefaults.standard.set(data,forKey:"UserData")}}数据常量是一个新数据可能会造成混淆的类型。它旨在存储您能想到的任何类型的数据,例如字符串、图像、zip文件等。但是,在这里,我们只关心它是可以直接写入UserDefaults的数据类型之一。当我们反其道而行之时(当我们有JSON数据并想将其转换为SwiftCodable类型时),我们应该使用JSONDecoder而不是JSONEncoder,但过程大致相同。这让我们结束了项目概述,所以继续并将您的项目重置为初始状态以便构建。本文转载自微信公众号“迅捷社区”,可通过以下二维码关注。转载本文请联系Swift社区公众号。