SwiftData @Model 与 ModelContext
使用 @Model 宏定义模型,并通过 ModelContext 执行增删改查。
SwiftData @Model 与 ModelContext 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
SwiftData 简介
SwiftData(iOS 17 及更高版本)是 Apple 的现代 Swift 原生持久化框架,其底层基于 Core Data。
import SwiftData
// Main concepts: @Model, ModelContainer, ModelContext@Model 宏
为类添加 @Model 注解,即可将其变为可持久化的 SwiftData 模型。属性会自动成为存储属性。
@Model
class Item {
var name: String
var createdAt: Date
init(name: String) {
self.name = name
self.createdAt = Date()
}
}设置 ModelContainer
使用您的模型类型创建 ModelContainer,并将其注入 SwiftUI 环境。
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for: Item.self)
}
}视图中的 ModelContext
使用 @Environment(\.modelContext) 在 SwiftUI 视图中访问模型上下文。
struct AddItemView: View {
@Environment(\.modelContext) private var context
func addItem() {
context.insert(Item(name: "New Item"))
}
}插入与删除
调用 context.insert 添加模型,调用 context.delete 删除模型。默认情况下,更改会自动保存。
let item = Item(name: "Coffee")
context.insert(item) // add
context.delete(item) // remove
// Auto-saved on next run loop使用 @Query 获取数据
SwiftUI 视图中的 @Query 会自动获取数据,并在底层数据发生更改时更新视图。
struct ItemList: View {
@Query(sort: \Item.createdAt, order: .reverse) var items: [Item]
var body: some View {
List(items) { item in Text(item.name) }
}
}使用谓词筛选
将 #Predicate 传递给 @Query,以声明式方式筛选结果。
@Query(filter: #Predicate<Item> { $0.name.contains("Swift") })
var swiftItems: [Item]手动保存
需要明确控制持久化更改的时机时,请调用 try context.save()。
do {
try context.save()
} catch {
print("Save error: \(error)")
}使用 @Attribute 自定义
在属性上使用 @Attribute 自定义持久化行为(例如唯一性和外部存储)。
@Model
class User {
@Attribute(.unique) var email: String
@Attribute(.externalStorage) var avatar: Data?
init(email: String) { self.email = email }
}@Transient 属性
为属性添加 @Transient 标记,将其排除在持久化之外。
@Model
class Session {
var token: String
@Transient var isExpired: Bool = false
init(token: String) { self.token = token }
}ModelContainer 配置
使用明确的架构和迁移方案配置容器,以支持模型版本管理。
let schema = Schema([Item.self, User.self])
let config = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
let container = try ModelContainer(for: schema, configurations: config)快速检查
哪个 SwiftUI 属性包装器会自动获取 SwiftData 模型,并在数据发生更改时更新视图?
课程回顾
为类添加 @Model 注解,使其可持久化。在应用层级设置 ModelContainer。通过 @Environment(\.modelContext) 读取和写入数据。使用 @Query 响应式获取数据。使用 #Predicate 进行筛选。
常见问题解答
「SwiftData @Model 与 ModelContext」课时是免费的吗?
是的 — 「SwiftData @Model 与 ModelContext」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「SwiftData @Model 与 ModelContext」这节课中我会学到什么?
使用 @Model 宏定义模型,并通过 ModelContext 执行增删改查。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「SwiftData @Model 与 ModelContext」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Core Data 堆栈:设置 NSPersistentContainer
- SwiftData @Model 与 ModelContext
- 关系与 FetchDescriptor
- 轻量级迁移与 CloudKit 同步