Связи и дескрипторы выборки
Моделируйте связи «один ко многим» и выполняйте запросы с помощью FetchDescriptor.
«Связи и дескрипторы выборки» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Связи SwiftData
Объявляйте связи между классами @Model с помощью свойств Swift. SwiftData определяет тип связи автоматически.
@Model
class Author {
var name: String
@Relationship(deleteRule: .cascade) var books: [Book] = []
init(name: String) { self.name = name }
}Атрибут @Relationship
Используйте @Relationship, чтобы явно указать правила удаления и обратные связи.
@Model
class Book {
var title: String
var author: Author?
init(title: String) { self.title = title }
}Правила удаления
Правила удаления определяют, что происходит со связанными объектами при удалении родительского объекта: .nullify, .cascade, .deny.
// .cascade: deleting Author deletes all Books
// .nullify: deleting Author sets book.author to nil
// .deny: prevents deletion if related objects exist
@Relationship(deleteRule: .cascade) var books: [Book] = []Связь «один ко многим»
Связь «один ко многим» объявляется как свойство-массив на стороне «один».
@Model class Department {
var name: String
@Relationship(deleteRule: .cascade) var employees: [Employee] = []
init(name: String) { self.name = name }
}
@Model class Employee {
var name: String
var department: Department?
init(name: String) { self.name = name }
}Связи «многие ко многим»
Для связи «многие ко многим» объявите массивы с обеих сторон.
@Model class Student {
var name: String
var courses: [Course] = []
init(name: String) { self.name = name }
}
@Model class Course {
var title: String
var students: [Student] = []
init(title: String) { self.title = title }
}FetchDescriptor
В SwiftData FetchDescriptor заменяет NSFetchRequest. Настройте его с помощью предиката, сортировки и ограничения количества результатов.
var descriptor = FetchDescriptor<Book>(
predicate: #Predicate { $0.title.contains("Swift") },
sortBy: [SortDescriptor(\Book.title)]
)
descriptor.fetchLimit = 10
let books = try context.fetch(descriptor)Сортировка с помощью SortDescriptor
Передайте массив SortDescriptor в FetchDescriptor для сортировки по нескольким столбцам.
let descriptor = FetchDescriptor<Item>(
sortBy: [
SortDescriptor(\Item.priority, order: .reverse),
SortDescriptor(\Item.name)
]
)Подсчёт без получения объектов
Используйте context.fetchCount, чтобы подсчитать подходящие записи, не загружая все объекты в память.
let descriptor = FetchDescriptor<Book>(
predicate: #Predicate { $0.rating > 4 }
)
let count = try context.fetchCount(descriptor)
print("High-rated books: \(count)")Предварительная загрузка связей
Задайте relationshipKeyPathsForPrefetching в FetchDescriptor, чтобы заранее загрузить связанные объекты.
var descriptor = FetchDescriptor<Author>()
descriptor.relationshipKeyPathsForPrefetching = [\Author.books]
let authors = try context.fetch(descriptor)@Query с параметрами FetchDescriptor
Макрос @Query поддерживает те же параметры сортировки и предиката, что и FetchDescriptor.
@Query(
filter: #Predicate<Book> { $0.author?.name == "Apple" },
sort: \Book.title
)
var books: [Book]Пакетные операции
SwiftData поддерживает пакетное удаление через context.delete(model:where:) для эффективных массовых операций.
try context.delete(model: Book.self, where: #Predicate { $0.rating < 2 })Быстрая проверка
Какой тип SwiftData заменяет NSFetchRequest для получения объектов @Model с фильтрацией и сортировкой?
Итоги урока
Объявляйте связи с помощью @Relationship(deleteRule:) в классах @Model. Используйте FetchDescriptor с #Predicate и SortDescriptor для запросов к данным. Используйте fetchCount для подсчёта и пакетное удаление для массового удаления.
Часто задаваемые вопросы
Урок «Связи и дескрипторы выборки» бесплатный?
Да — полный текст урока «Связи и дескрипторы выборки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Связи и дескрипторы выборки»?
Моделируйте связи «один ко многим» и выполняйте запросы с помощью FetchDescriptor. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Связи и дескрипторы выборки»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Стек Core Data: настройка NSPersistentContainer
- SwiftData @Model и ModelContext
- Связи и дескрипторы выборки
- Облегчённые миграции и синхронизация CloudKit