SwiftData’s new Index and Unique macros
Peter Yaacoub •
Introduction
These are notes taken during the WWDC24 session: What’s new in SwiftData.
Alongside the existing Attribute
, Relationship
, and Transient
macros, new Index
and Unique
macros are now available in SwiftData starting with iOS 18.
Index
The Index
macro specifies model properties that are frequently filtered and sorted to enhance the efficiency of these operations.
In my app, Huh? Dictionary, when users search for a word in the search bar, previously searched entries appear below it, sorted by recency and filtered by relevance. Therefore, the word
property of SearchEntry
is an ideal candidate for the Index
macro.
import Foundation
import SwiftData
@Model
final class SearchEntry {
// MARK: - Macros
#Index<SearchEntry>([\.word])
// MARK: - Init
init(word: String) {
self.word = word
}
// MARK: - Properties
@Attribute(.unique) var word: String
var date: Date = Date.now
}
Similar to the Unique
macro below, properties can be grouped together in an array. This is useful when filtering or sorting requires them in the same boolean expression. For example, if users can enter a date range before submitting a search query, the indices for my Index
macro would differ to optimize efficiency.
#Index<SearchEntry>([\.word], [\.word, \.date])
Unique
The Unique
macro extends the Attribute’s unique
Option
by ensuring a model entity is unique based on combinations of multiple properties. For instance, if a Person
entity has id
, givenName
, and familyName
, uniqueness can be defined based on id
alone or givenName
and familyName
together.
import Foundation
import SwiftData
@Model
final class Person {
// MARK: - Macros
#Unique<Person>([\.id], [\.givenName, \.familyName])
// MARK: - Init
init(id: UUID, givenName: String, familyName: String) {
self.id = id
self.givenName = givenName
self.familyName = familyName
}
// MARK: - Properties
var id: UUID
var givenName: String
var familyName: String
}
Conclusion
The Index
and Unique
macros introduce significant improvements to SwiftData
, enhancing efficiency, storage, and speed. Despite being only a year old, this framework promises simplicity and power, achieving what CoreData
had not previously accomplished.