0Pricing
Swift Academy · Урок

Связи и дескрипторы выборки

Моделируйте связи «один ко многим» и выполняйте запросы с помощью 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 — локальная установка не требуется.

Все уроки этого курса

  1. Стек Core Data: настройка NSPersistentContainer
  2. SwiftData @Model и ModelContext
  3. Связи и дескрипторы выборки
  4. Облегчённые миграции и синхронизация CloudKit
← Назад к Swift Academy