How to Use SwiftData in Swift: Simple Guide for iOS Apps
To use
SwiftData in Swift, you define your data models as @Model structs or classes, then use @Environment(\.modelContext) to access the data context for saving and fetching. SwiftData simplifies data management by integrating with SwiftUI and providing automatic persistence.Syntax
SwiftData uses @Model to mark data models, and @Environment(\.modelContext) to access the data context. You create, update, and delete data using this context.
@Model: Marks a struct or class as a data model.@Environment(\.modelContext): Provides the context to save or fetch data.- Use
modelContext.insert()to add new data. - Call
try? modelContext.save()to persist changes.
swift
import SwiftData import SwiftUI @Model class Item { var name: String init(name: String) { self.name = name } } struct ContentView: View { @Environment(\.modelContext) private var modelContext func addItem() { let newItem = Item(name: "Sample") modelContext.insert(newItem) try? modelContext.save() } var body: some View { Button("Add Item", action: addItem) } }
Example
This example shows a simple SwiftUI app using SwiftData to add and list items. It demonstrates defining a model, inserting data, and displaying saved items.
swift
import SwiftUI import SwiftData @Model class Task { var title: String init(title: String) { self.title = title } } struct ContentView: View { @Environment(\.modelContext) private var modelContext @Query private var tasks: [Task] var body: some View { VStack { List(tasks, id: \.self) { task in Text(task.title) } Button("Add Task") { let newTask = Task(title: "New Task") modelContext.insert(newTask) try? modelContext.save() } } } } @main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() .modelContainer(for: [Task.self]) } } }
Output
A window with a list showing saved tasks and a button labeled "Add Task". Pressing the button adds "New Task" to the list.
Common Pitfalls
Common mistakes when using SwiftData include:
- Not marking your model with
@Model, so data won't be tracked. - Forgetting to call
try? modelContext.save()after changes, so data is not persisted. - Not injecting the model container in your app entry point with
.modelContainer(for:). - Using classes without initializers or missing required properties.
swift
/* Wrong: Missing @Model annotation */ class Person { var name: String init(name: String) { self.name = name } } /* Right: Add @Model to enable SwiftData tracking */ @Model class Person { var name: String init(name: String) { self.name = name } }
Quick Reference
SwiftData quick tips:
- Use
@Modelto define data models. - Access data context with
@Environment(\.modelContext). - Insert new objects with
modelContext.insert(object). - Save changes with
try? modelContext.save(). - Use
@Queryto fetch data reactively in SwiftUI. - Inject model container in your app with
.modelContainer(for:).
Key Takeaways
Mark your data models with @Model to enable SwiftData features.
Use @Environment(\.modelContext) to access and save data changes.
Always call try? modelContext.save() after inserting or updating data.
Inject the model container in your app entry point with .modelContainer(for:).
Use @Query to fetch and display data reactively in SwiftUI views.