0Pricing
Swift Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Core Data 堆栈:设置 NSPersistentContainer
  2. SwiftData @Model 与 ModelContext
  3. 关系与 FetchDescriptor
  4. 轻量级迁移与 CloudKit 同步
← 返回 Swift Academy