曹耘豪的博客

Swift使用UserDefaults保存数据

  1. 基本方法
  2. 保存自定义类
  3. 进阶需求

基本方法

UserDefaults可以保存简单的数据结构

使用UserDefaults.standard获取UserDefaults对象

保存数据方法

1
2
// 保存数据
func set(_ value: Any?, forKey defaultName: String)

获取数据方法

1
2
3
4
5
6
// 获取字典
UserDefaults.standard.dictionary(forKey: name)
// 获取数组
UserDefaults.standard.array(forKey: arrayName)
// 获取对象
UserDefaults.standard.object(forKey: key)

删除数据

1
2
3
4
// 删除某个键
UserDefaults.standard.removeObject(forKey: key)
// 删除所有
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

保存自定义类

UserDefaults可以对内置基本类型有很好的支持,但我们有时需要保存自定义的数据结构。自定义的类型不能直接保存至UserDefaults,我们需要将其转化为Data

这里,我们使用NSKeyedArchiverNSKeyedUnarchiver对数据进行转化。因此,自定义的类需要满足以下条件:

作为一个例子,我们保存以下这个自定义的类至UserDefaults

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Storage: NSObject, NSCoding {
var id: String

init(id: String) {
self.id = id
}

func encode(with aCoder: NSCoder) {
aCoder.encode(id, forKey: "id")
}

required init?(coder aDecoder: NSCoder) {
id = aDecoder.decodeObject(forKey: "id") as! String
}
}

保存和读取时:

1
2
3
4
5
6
7
8
9
10
// 保存
return UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: storageObject), forKey: key)

// 读取
let data = UserDefaults.standard.object(forKey: key)
if let data = data {
return NSKeyedUnarchiver.unarchiveObject(with: data as! Data) as! Storage
} else {
return nil
}

进阶需求

  1. 可以对数组元素进行增删
  2. 可以对字典Key-Value进行增删

思路:类似于指针

  1. 在数组和字典的值保存为String
  2. 这个String作为Key,使用UserDefaults.standard.object获取具体的值,这样对数据的修改也不会对数组和字典进行修改。