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
- Stos Core Data: konfiguracja NSPersistentContainer
- SwiftData @Model i ModelContext
- Relacje i deskryptory pobierania
- Lekkie migracje i synchronizacja z CloudKit