# 本地存储

URL: https://caijiao.org/swift/14-todo-app/04-storage
Source: docs/swift/14-todo-app/04-storage.md
Description: 本章节讲解待办事项 App 中本地存储的实现方法，介绍使用 UserDefaults 和文件存储保存任务数据，保障数据持久化和安全。

本地存储是待办事项 App 保障用户数据持久保存的重要环节。

## 常用存储方式

### UserDefaults

适合存储简单数据，使用方便，但不适合大量数据。

```swift
func saveTodos(_ todos: [TodoItem]) {
    if let encoded = try? JSONEncoder().encode(todos) {
        UserDefaults.standard.set(encoded, forKey: "todos")
    }
}

func loadTodos() -> [TodoItem] {
    if let data = UserDefaults.standard.data(forKey: "todos"),
       let todos = try? JSONDecoder().decode([TodoItem].self, from: data) {
        return todos
    }
    return []
}
````

### 文件存储

适合存储结构化数据，使用文件系统保存 JSON 或自定义格式。

```swift
func getDocumentsDirectory() -> URL {
    FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
}

func saveToFile(_ todos: [TodoItem]) {
    let url = getDocumentsDirectory().appendingPathComponent("todos.json")
    if let data = try? JSONEncoder().encode(todos) {
        try? data.write(to: url)
    }
}

func loadFromFile() -> [TodoItem] {
    let url = getDocumentsDirectory().appendingPathComponent("todos.json")
    if let data = try? Data(contentsOf: url),
       let todos = try? JSONDecoder().decode([TodoItem].self, from: data) {
        return todos
    }
    return []
}
```

## CoreData（进阶）

对于复杂数据和关系型数据，可以使用 CoreData 提供更强大的持久化支持。

## 小结

选择合适的本地存储方式，保障数据安全和访问效率，是待办事项 App 开发的重要环节。
