2023 EssentialsSwift
WWDC23 · 9 min · Essentials / Swift
Meet SwiftData
SwiftData is a powerful and expressive persistence framework built for Swift. We’ll show you how you can model your data directly from Swift code, use SwiftData to work with your models, and integrate with SwiftUI.
Watch at developer.apple.com ↗Chapters
Code shown on screen · 10 snippets
Adding @Model to Trip
import SwiftData
class Trip {
var name: String
var destination: String
var endDate: Date
var startDate: Date
var bucketList: [BucketListItem]? = []
var livingAccommodation: LivingAccommodation?
} Providing options for @Attribute and @Relationship
class Trip {
(.unique) var name: String
var destination: String
var endDate: Date
var startDate: Date
(.cascade) var bucketList: [BucketListItem]? = []
var livingAccommodation: LivingAccommodation?
} Initialize a ModelContainer
// Initialize with only a schema
let container = try ModelContainer([Trip.self, LivingAccommodation.self])
// Initialize with configurations
let container = try ModelContainer(
for: [Trip.self, LivingAccommodation.self],
configurations: ModelConfiguration(url: URL("path"))
) Creating a model container in SwiftUI
import SwiftUI
@main
struct TripsApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(
for: [Trip.self, LivingAccommodation.self]
)
}
} Accessing the environment's ModelContext
import SwiftUI
struct ContextView : View {
(\.modelContext) private var context
} Building a predicate
let today = Date()
let tripPredicate = #Predicate<Trip> {
$0.destination == "New York" &&
$0.name.contains("birthday") &&
$0.startDate > today
} Fetching with a FetchDescriptor
let descriptor = FetchDescriptor<Trip>(predicate: tripPredicate)
let trips = try context.fetch(descriptor) Fetching with fetch and sort descriptors
let descriptor = FetchDescriptor<Trip>(
sortBy: SortDescriptor(\Trip.name),
predicate: tripPredicate
)
let trips = try context.fetch(descriptor) Working with a ModelContext
var myTrip = Trip(name: "Birthday Trip", destination: "New York")
// Insert a new trip
context.insert(myTrip)
// Delete an existing trip
context.delete(myTrip)
// Manually save changes to the context
try context.save() Using @Query in SwiftUI
import SwiftUI
struct ContentView: View {
(sort: \.startDate, order: .reverse) var trips: [Trip]
(\.modelContext) var modelContext
var body: some View {
NavigationStack() {
List {
ForEach(trips) { trip in
// ...
}
}
}
}
} Resources
Related sessions
-
34 min -
13 min -
19 min -
43 min -
11 min -
9 min -
16 min