返回
SwiftUI 入门 - 处理复杂数据类型:自定义类型、数组和字典
IOS
2024-01-18 23:13:23
SwiftUI 100 天:iExpense 第 3 部分 - 巧妙处理复杂数据类型
存储基本数据类型(例如整数、字符串和布尔值)时,UserDefaults 是一种非常实用的工具。然而,当我们处理更复杂的类型(例如自定义 Swift 类型、数组或字典)时,还需要进行一些额外的处理。
处理自定义 Swift 类型
自定义 Swift 类型无法直接存储在 UserDefaults 中。为此,我们需要将这些类型转换成某种支持的格式,例如 JSON 字符串。下面是自定义类型 Person
的一个示例:
struct Person: Codable {
let name: String
let age: Int
}
我们可以使用 JSONEncoder
和 JSONDecoder
将 Person
对象编码和解码为 JSON 字符串:
let encoder = JSONEncoder()
let data = try encoder.encode(person) // 将 person 编码为 JSON
let decoder = JSONDecoder()
let decodedPerson = try decoder.decode(Person.self, from: data) // 从 JSON 解码回 person
将 Person
对象编码为 JSON 后,我们就可以将其存储在 UserDefaults 中:
UserDefaults.standard.set(data, forKey: "person")
稍后,我们可以使用 JSONDecoder
将存储的数据解码回 Person
对象:
let data = UserDefaults.standard.data(forKey: "person")
let decoder = JSONDecoder()
let decodedPerson = try decoder.decode(Person.self, from: data)
处理数组和字典
UserDefaults 允许我们存储数组和字典,但这些集合必须包含基本数据类型或支持编码的类型。为了处理自定义类型,我们需要将它们编码为 JSON 字符串,然后再存储在数组或字典中。
例如,我们可以创建一个包含 Person
对象的数组:
let people = [person1, person2, person3]
let encoder = JSONEncoder()
let data = try encoder.encode(people) // 将 people 编码为 JSON
UserDefaults.standard.set(data, forKey: "people")
稍后,我们可以使用 JSONDecoder
将存储的数据解码回 Person
对象数组:
let data = UserDefaults.standard.data(forKey: "people")
let decoder = JSONDecoder()
let decodedPeople = try decoder.decode([Person].self, from: data)
对于字典,我们可以使用类似的方法,将自定义类型编码为 JSON 字符串,再存储在字典中。
总结
通过将复杂类型编码为 JSON 字符串,我们可以使用 UserDefaults 存储和检索各种类型的数据。这扩展了 UserDefaults 的功能,使其成为存储持久数据的更强大的工具。