0Pricing
Swift Academy · Lekcja

Relacje i deskryptory pobierania

Modelowanie relacji jeden-do-wielu i wykonywanie zapytań za pomocą FetchDescriptor.

Relacje i deskryptory pobierania to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Relacje w SwiftData

Relacje między klasami @Model należy deklarować za pomocą właściwości Swift. SwiftData automatycznie rozpoznaje typ relacji.

@Model
class Author {
  var name: String
  @Relationship(deleteRule: .cascade) var books: [Book] = []
  init(name: String) { self.name = name }
}

Atrybut @Relationship

Należy użyć @Relationship, aby jawnie określić reguły usuwania i relacje odwrotne.

@Model
class Book {
  var title: String
  var author: Author?
  init(title: String) { self.title = title }
}

Reguły usuwania

Reguły usuwania określają, co dzieje się z powiązanymi obiektami po usunięciu obiektu nadrzędnego: .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] = []

Relacja jeden do wielu

Relację jeden do wielu deklaruje się jako właściwość tablicową po stronie „jeden”.

@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 }
}

Relacje wiele do wielu

Relację wiele do wielu należy deklarować za pomocą tablic po obu stronach.

@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

FetchDescriptor zastępuje NSFetchRequest w SwiftData. Należy go skonfigurować za pomocą predykatu, sortowania i limitu pobierania.

var descriptor = FetchDescriptor<Book>(
  predicate: #Predicate { $0.title.contains("Swift") },
  sortBy: [SortDescriptor(\Book.title)]
)
descriptor.fetchLimit = 10
let books = try context.fetch(descriptor)

Sortowanie za pomocą SortDescriptor

Należy przekazać tablicę SortDescriptor do FetchDescriptor, aby sortować według wielu kolumn.

let descriptor = FetchDescriptor<Item>(
  sortBy: [
    SortDescriptor(\Item.priority, order: .reverse),
    SortDescriptor(\Item.name)
  ]
)

Zliczanie bez pobierania

Należy użyć context.fetchCount, aby zliczyć pasujące rekordy bez wczytywania wszystkich obiektów do pamięci.

let descriptor = FetchDescriptor<Book>(
  predicate: #Predicate { $0.rating > 4 }
)
let count = try context.fetchCount(descriptor)
print("High-rated books: \(count)")

Wstępne pobieranie relacji

Należy ustawić relationshipKeyPathsForPrefetching w FetchDescriptor, aby wstępnie wczytać powiązane obiekty.

var descriptor = FetchDescriptor<Author>()
descriptor.relationshipKeyPathsForPrefetching = [\Author.books]
let authors = try context.fetch(descriptor)

@Query z opcjami podobnymi do FetchDescriptor

Makro @Query obsługuje te same opcje sortowania i predykatów co FetchDescriptor.

@Query(
  filter: #Predicate<Book> { $0.author?.name == "Apple" },
  sort: \Book.title
)
var books: [Book]

Operacje wsadowe

SwiftData obsługuje wsadowe usuwanie za pomocą context.delete(model:where:), co umożliwia wydajne operacje na wielu obiektach.

try context.delete(model: Book.self, where: #Predicate { $0.rating < 2 })

Szybkie sprawdzenie

Jaki typ SwiftData zastępuje NSFetchRequest podczas pobierania obiektów @Model z filtrowaniem i sortowaniem?

Podsumowanie lekcji

Relacje należy deklarować za pomocą @Relationship(deleteRule:) w klasach @Model. Do wyszukiwania danych należy używać FetchDescriptor z #Predicate i SortDescriptor. Do zliczania należy używać fetchCount, a do masowego usuwania — usuwania wsadowego.

Często zadawane pytania

Czy lekcja „Relacje i deskryptory pobierania” jest bezpłatna?

Tak — pełny tekst „Relacje i deskryptory pobierania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Relacje i deskryptory pobierania”?

Modelowanie relacji jeden-do-wielu i wykonywanie zapytań za pomocą FetchDescriptor. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Relacje i deskryptory pobierania”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Stos Core Data: konfiguracja NSPersistentContainer
  2. SwiftData @Model i ModelContext
  3. Relacje i deskryptory pobierania
  4. Lekkie migracje i synchronizacja z CloudKit
← Powrót do Swift Academy