April 3, 2024

How to Use SwiftData in Your Next Swift Project

If you're looking for a powerful and easy-to-use data modeling and management framework for your Swift project, SwiftData is an excellent choice. Introduced at WWDC 2023, SwiftData provides a more Swift-like API and simplifies many common tasks involved in working with data. In this article, we will explore how you can leverage SwiftData to enhance your Swift project's data management capabilities.

Getting Started with SwiftData

To get started with SwiftData, you need to integrate it into your project. There are two possible ways to do this:

  1. Implement SwiftData over a Core Data application: If you are already using Core Data in your app, integrating SwiftData is a breeze. You can simply add SwiftData models alongside your existing Core Data models. This allows you to take advantage of SwiftData's features without having to rewrite your entire data layer.
  2. SwiftData from scratch: If you're starting a new project or want to migrate away from Core Data, using SwiftData from scratch is a great option. SwiftData offers a code-centric approach, allowing you to model your data directly from Swift code using structs, enums, and protocols. This makes it easy to create expressive and concise models that reflect your real-world data.

Modeling Your Data

One of the key features of SwiftData is its ability to model data directly from Swift code. You can define your models using Swift classes decorated with SwiftData's @Model macro. For example, let's say you want to create a User model class:


By using the @Model macro, SwiftData automatically generates the necessary database schema and provides you with a seamless API for working with your models.

After that we have to create a model container and make it available to your app's view hierarchy through SwiftData's modelContainer view modifier. By default, modelContainer will persist the models on the device.


Fetching and Updating Data

SwiftData provides a robust and intuitive API for fetching and updating data. With the provided API, you can filter, sort, and limit your data results. Additionally, SwiftData supports nested queries, simplifying the retrieval of complex data sets.

To update data, you can easily modify your model objects and use the save() method to apply your changes. This guarantees that your data stays current and coherent.

Accessing the context from the views allows you to perform CRUD operations, i.e:


Managing Relationships

Managing relationships between data entities is made easy with SwiftData. SwiftData supports one-to-one, one-to-many, and many-to-many relationships, allowing you to easily model the complex relationships between your data.

As demonstrated in the first example with the User model, you can declare the relationship as follows:


Limitations and Considerations

While SwiftData is a powerful framework, it still has a few limitations to be aware of. It is currently supported on iOS 17+ and macOS 14+. Some features, such as support for complex relationships and custom migrations, are still under development. Additionally, as SwiftData is a relatively new framework, community support may be limited compared to more established solutions.


SwiftData is a versatile and user-friendly data modeling and management framework that empowers Swift developers to create robust data layers in their projects. Whether you're building a new app from scratch or looking to enhance your existing Core Data application, SwiftData provides a seamless and expressive API for working with data.

By leveraging SwiftData's code-centric approach, you can easily model your data, fetch and update records, manage relationships, and migrate your data model over time. With its Swift-like API and powerful features, SwiftData is a valuable tool for any Swift project.

So why not give SwiftData a try in your next Swift project? It may just be the missing piece that takes your data management to the next level.

*Authors: Karen Stoletniy, Daniel Parra, Tarek Radovan, Francisco Conelli, Fabrizio Piruzi.