С момента появления SwiftData разработчики периодически сталкивались с ограничениями. Фильтрация по enum требовала костылей. Группировка данных в секции была недоступна. Наблюдение за изменениями вне SwiftUI View - сложной задачей. В iOS 27 компания Apple закрыла большинство этих пробелов. Разберем ключевые улучшения.
Enum-предикаты стали реальностью:
До iOS 27 фильтрация по enum-свойствам была больной темой. Если модель содержала enum, приходилось сохранять его raw-значение в отдельное поле и строить предикаты уже на основе него. Теперь это работает напрямую.
_books = Query(filter: #Predicate<Book> {
$0.category == .fiction
})
Модель становится чище. Не нужно дублировать данные только для фильтрации.
Группировка в секции:
Появилась поддержка группировки результатов через параметр sectionBy в макросе
@Query.
@Query(sort: \Expense.name, sectionBy: \Expense.budgetName)
var expenses: [Expense]
При этом данные группируются прямо в базе, а не в памяти. Есть ограничение: значение для группировки должно быть сохраненным свойством. Связанные свойства (например, expense.budget?.name) пока не поддерживаются. Приходится дублировать данные.
Составные предикаты:
Раньше, чтобы объединить несколько условий, нужно было собрать все в один большой предикат. Сейчас появились Predicate(all:) и Predicate(any:).
let searchPredicate = #Predicate<Book> {
$0.name.localizedStandardContains(search)
}
let bestSellerPredicate = #Predicate<Book> {
$0.isBestSeller == isBestSeller
}
_books = Query(
filter: Predicate(all: [searchPredicate, bestSellerPredicate])
)
Удобно для динамических фильтров. Предикаты можно собирать по частям и комбинировать.
Атрибут .codable:
Новый параметр для макроса
@Attribute. Если тип нельзя разложить на колонки, но он реализует Codable, SwiftData может сохранить его как BLOB.
@Attribute(.codable)
var identifier: MKMapItem.Identifier
Важный нюанс: данные, сохраненные через .codable, нельзя использовать в фильтрах и сортировках. Это просто сериализованный кусок данных.
🔗 Читать подробнее
💡 Вывод:
SwiftData в iOS 27 стала более практичной. Меньше костылей, больше возможностей. Enum-предикаты убирают дублирование. Секции упрощают представление данных. .codable закрывает проблему со сложными типами. ResultsObserver позволяет строить логику на изменениях без привязки к UI.
Это не революция, но плотное обновление, которое делает SwiftData пригодным для более сложных проектов. Особенно тех, где данные нужно не просто показывать, но и обрабатывать, синхронизировать и обновлять за пределами интерфейса.
Но еще не все проблемы решены. Группировка по связанным свойствам до сих пор не работает. Хранилище изменений через HistoryObserver требует ручной работы с токенами. Но направление верное.
Подписаться на канал:
➡️ Telegram | Max