Swift Data 完全指南:Swift 数据持久化框架教程与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift Data:苹果全新 ORM 框架,简化 Swift 数据持久化

1. 什么是 Swift Data?为什么需要它?

Swift Data 是苹果在 WWDC 2023 上推出的现代化、轻量级 ORM(对象关系映射)框架,专为 Swift 应用中的持久化数据管理而设计,支持 iOS 17+、macOS 14+、tvOS 17+ 和 watchOS 10+。Swift Data 取代了老旧的 Core Data,提供更简单、声明式且类型安全的方式来管理数据库。

为什么需要 Swift Data?核心目的是大幅简化代码。开发者无需手动创建 NSManagedObject、配置上下文或编写复杂的 Swift 查询,只需通过普通的 Swift 类和宏(@Model、@Attribute、@Relationship)来描述数据模型。Swift Data 会自动生成所有底层逻辑:表创建、变更管理、依赖跟踪,并通过 SwiftUI 实现 UI 同步。

关键优势在于与 SwiftUI 的深度集成。数据变更会自动更新界面,无需手动调用 objectWillChange.send() 或重新加载列表。这使得 Swift Data 成为需要本地数据存储(如任务列表、笔记、设置、缓存)的 SwiftUI 新项目的理想选择。

2. 安装指南

Swift Data 是苹果标准库的一部分,从 iOS 17 和 macOS 14 开始内置。无需通过包管理器(如 pip、npm、cargo)单独安装。使用时只需在 Swift 文件中导入框架即可。

重要提示:项目的部署目标(Deployment Target)最低必须设为 iOS 17.0 或 macOS 14.0。

通过 Xcode 添加到项目的命令:

// Swift Data 无需安装,直接导入即可:
import SwiftData

如果你使用 Swift Package Manager (SPM) 管理依赖,无需将 Swift Data 作为独立包添加——它已内置于 SDK 中。

3. 快速上手——最小化工作示例

创建一个简单的待办事项(To-Do)列表应用。

import SwiftUI
import SwiftData

// 1. 定义数据模型
@Model
final class TaskItem {
    var title: String
    var isCompleted: Bool
    var createdAt: Date

    init(title: String, isCompleted: Bool = false) {
        self.title = title
        self.isCompleted = isCompleted
        self.createdAt = Date()
    }
}

// 2. 在 App 中配置容器
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for: TaskItem.self) // 自动创建容器
    }
}

// 3. 在视图中使用数据
struct ContentView: View {
    @Environment(\.modelContext) private var context
    @Query private var tasks: [TaskItem]

    var body: some View {
        NavigationStack {
            List {
                ForEach(tasks) { task in
                    HStack {
                        Text(task.title)
                        Spacer()
                        if task.isCompleted {
                            Image(systemName: "checkmark")
                        }
                    }
                }
                .onDelete(perform: deleteTasks)
            }
            .navigationTitle("待办事项")
            .toolbar {
                ToolbarItem {
                    Button("添加") {
                        let newTask = TaskItem(title: "新任务 \(tasks.count + 1)")
                        context.in                    

推荐