Skip to content

13.3 存储自定义对象(使用Codable)

在iOS开发中,UserDefaults 是一个非常方便的轻量级数据存储方案。虽然它主要用于存储基本数据类型,但通过 Codable 协议,你也可以轻松地存储和读取自定义对象。让我们一起看看如何实现吧!🎉

什么是 Codable 协议?

Codable 是 Swift 4 引入的一个强大的协议,它实际上是 EncodableDecodable 两个协议的组合。实现了 Codable 协议的类型可以自动地转换为 JSON 数据,也可以从 JSON 数据转换为对象。这大大简化了数据序列化和反序列化的过程。

存储自定义对象

首先,你需要创建一个遵循 Codable 协议的自定义类或结构体。例如,我们创建一个 Person 结构体:

swift
struct Person: Codable {
    var name: String
    var age: Int
}

接下来,你可以创建一个 Person 对象,并将其存储到 UserDefaults 中。由于 UserDefaults 只能直接存储基本数据类型,我们需要先将 Person 对象转换为 Data 类型:

swift
let person = Person(name: "张三", age: 30)

let encoder = JSONEncoder()
if let encoded = try? encoder.encode(person) {
    UserDefaults.standard.set(encoded, forKey: "myPerson")
    print("Person 对象已存储!")
}

这里,我们使用了 JSONEncoderPerson 对象编码为 JSON 数据,然后将 JSON 数据存储到 UserDefaults 中。

读取自定义对象

UserDefaults 中读取自定义对象的过程与存储类似,需要先从 UserDefaults 中获取 Data,然后将其解码为 Person 对象:

swift
if let savedPersonData = UserDefaults.standard.data(forKey: "myPerson") {
    let decoder = JSONDecoder()
    if let loadedPerson = try? decoder.decode(Person.self, from: savedPersonData) {
        print("姓名:\(loadedPerson.name), 年龄:\(loadedPerson.age)")
    }
}

这里,我们使用了 JSONDecoder 将 JSON 数据解码为 Person 对象。如果解码成功,就可以访问 Person 对象的属性了。

示例代码

下面是一个完整的示例代码,展示了如何存储和读取自定义对象:

swift
struct Person: Codable {
    var name: String
    var age: Int
}

// 存储
let person = Person(name: "李四", age: 25)
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(person) {
    UserDefaults.standard.set(encoded, forKey: "myPerson")
    print("Person 对象已存储!")
}

// 读取
if let savedPersonData = UserDefaults.standard.data(forKey: "myPerson") {
    let decoder = JSONDecoder()
    if let loadedPerson = try? decoder.decode(Person.self, from: savedPersonData) {
        print("姓名:\(loadedPerson.name), 年龄:\(loadedPerson.age)")
    }
}

注意事项

  • 确保你的自定义类型遵循 Codable 协议。
  • 使用 JSONEncoderJSONDecoder 进行编码和解码。
  • 存储和读取时使用相同的 key。
  • 处理编码和解码过程中可能出现的错误。

通过以上步骤,你可以轻松地使用 UserDefaults 存储和读取自定义对象。这对于存储一些简单的配置信息或用户数据非常有用。希望这个教程对你有所帮助!🚀

本站使用 VitePress 制作