SwiftData

SwiftData makes it easy to persist data using declarative code. You can query and filter data using regular Swift code. And it’s designed to integrate seamlessly with SwiftUI.

What’s new

SwiftData offers an expressive and lightweight API for modeling and persisting your app’s data using pure Swift code. New APIs allow you to build custom data stores, work with transaction history, model indices and compound uniqueness constraints, and more.

Watch the latest video

Create models with Swift

Model your data using regular Swift types with @Model, with no additional files or tools to manage. SwiftData can automatically infer many relationships and you can use clear declarations like #Unique to describe constraints. Like SwiftUI, the source of truth is in your code.

@Model
class Recipe {
	@Attribute(.unique) var name: String
	var summary: String?
	var ingredients: [Ingredient]
}

Automatic persistence

SwiftData builds a custom schema using your models and maps their fields efficiently to the underlying storage. Objects managed by SwiftData are fetched from the database when needed and automatically saved at the right moment, with no additional work on your part. You can also take full control using the ModelContext API.

Custom data stores

By default, SwiftData uses Core Data for persistence, but you can also implement your own persistence layer using the new DataStore protocol. With DataStore, SwiftData APIs can be used with many types of persistence, from JSON files to web services and database engines, without changing your SwiftUI and SwiftData modeling code.

Integrates with SwiftUI

Use @Query in your SwiftUI views to fetch data. SwiftData and SwiftUI work together to provide live updates to your views when the underlying data changes, with no need to manually refresh the results.

@Query var recipes: [Recipe]
var body: some View {
	List(recipes) { recipe in
		NavigationLink(recipe.name, destination: RecipeView(recipe))
	}
}

Swift-native predicates

Query and filter your data using native Swift types that can be checked by the compiler so you can catch issues earlier during development. Predicates provide compile-time errors when your expressions can’t be mapped to the underlying storage engine.

let simpleFood = #Predicate<Recipe> { recipe in
	recipe.ingredients.count < 3
}

CloudKit syncing

Your data can be stored in files using DocumentGroup and synced via iCloud Drive, or you can use CloudKit to sync data between devices.

Compatible with Core Data

SwiftData uses the proven storage architecture of Core Data, so you can use both in the same app with the same underlying storage. When you’re ready, Xcode can convert your Core Data models into classes for use with SwiftData.