CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
SwiftUI 开发入门/课时/数据持久化
RawBlame
课时目录12 节

SwiftUI 开发入门

  1. 01Swift 与 SwiftUI 概览
  2. 02基础语法与类型
  3. 03控制流
  4. 04函数与闭包
  5. 05结构体、类与协议
  6. 06SwiftUI 视图
  7. 07状态管理
  8. 08导航与生命周期
  9. 09并发与 async/await
  10. 10数据持久化
  11. 11MVVM 与架构
  12. 12综合练习

数据持久化

UserDefaults、SwiftData、Core Data。

30 分钟

数据持久化

SwiftUI App 本地存储分层:UserDefaults 存偏好、SwiftData / Core Data 存结构化数据、FileManager 存文件。对照 /roadmaps/swift-ui「数据持久化」节点。

学习目标

  • 选择合适的存储方案(轻量 vs 关系型)
  • 使用 UserDefaults 与 @AppStorage 绑定 UI
  • 了解 SwiftData @Model 基础 CRUD
  • 在 SwiftUI 中观察持久化数据变化

核心概念

UserDefaults 与 @AppStorage

// 命令式读写
UserDefaults.standard.set("swift-ui-essentials", forKey: "lastTrack")
let slug = UserDefaults.standard.string(forKey: "lastTrack") ?? ""

// SwiftUI 声明式绑定
struct PreferencesView: View {
    @AppStorage("darkMode") private var darkMode = false
    @AppStorage("lastTrack") private var lastTrack = ""

    var body: some View {
        Form {
            Toggle("深色模式", isOn: $darkMode)
            TextField("上次 Track", text: $lastTrack)
        }
    }
}

@AppStorage 自动同步 UserDefaults,Toggle/TextField 变更即时持久化。适合主题、引导标记等小数据。

SwiftData 基础

import SwiftData

@Model
final class Bookmark {
    var title: String
    var url: String
    var createdAt: Date

    init(title: String, url: String) {
        self.title = title
        self.url = url
        self.createdAt = .now
    }
}

struct BookmarkListView: View {
    @Environment(\.modelContext) private var context
    @Query(sort: \Bookmark.createdAt, order: .reverse) private var bookmarks: [Bookmark]
    @State private var newTitle = ""

    var body: some View {
        List {
            ForEach(bookmarks) { item in
                VStack(alignment: .leading) {
                    Text(item.title).font(.headline)
                    Text(item.url).font(.caption).foregroundStyle(.secondary)
                }
            }
            .onDelete(perform: deleteBookmarks)
        }
        .navigationTitle("书签")
        .toolbar {
            Button("添加示例") { addSample() }
        }
    }

    private func addSample() {
        let item = Bookmark(title: "SwiftUI 文档", url: "https://developer.apple.com")
        context.insert(item)
    }

    private func deleteBookmarks(at offsets: IndexSet) {
        for index in offsets {
            context.delete(bookmarks[index])
        }
    }
}

iOS 17+ SwiftData 用 @Model 宏定义实体, 自动查询并驱动 List 刷新。App 入口需 。

@Query
.modelContainer(for: Bookmark.self)

存储选型

方案数据量典型场景
UserDefaults / @AppStorage极小主题、上次打开页
SwiftData / Core Data中到大书签、课时进度
FileManager文件缓存图片、导出
Keychain敏感小数据Token(见 ios-essentials)

与 React/SwiftUI 对照

SwiftUI 持久化Web / React说明
UserDefaultslocalStorage键值偏好
@AppStorageuseLocalStorage Hook双向绑定
SwiftData @QueryReact Query / SWR响应式数据源
@ModelORM Entity结构化模型
Core DataIndexedDB + ORM复杂查询
FileManagerFile API二进制文件

React 无内置 ORM;SwiftData 类似 Prisma + 自动 UI 刷新,List 随数据库变更重绘。

练习

  • 用 @AppStorage 记住用户上次选中的 Tab
  • 创建 SwiftData LessonProgress 模型,实现增删
  • 在 App 入口配置 .modelContainer
  • 对比 UserDefaults 与 SwiftData 适用边界

小结

@AppStorage 轻量偏好、SwiftData 结构化持久化、@Query 驱动 List。 下一课 MVVM 与架构。见 swift-ui-essentials。

加载本节练习…
← 上一课并发与 async/await下一课 →MVVM 与架构