Relations et FetchDescriptor
Modéliser des relations un-à-plusieurs et effectuer des requêtes avec FetchDescriptor.
Relations et FetchDescriptor est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 4 leçons au total.
Relations SwiftData
Déclarez des relations entre les classes @Model à l’aide de propriétés Swift. SwiftData déduit automatiquement le type de relation.
@Model
class Author {
var name: String
@Relationship(deleteRule: .cascade) var books: [Book] = []
init(name: String) { self.name = name }
}Attribut @Relationship
Utilisez @Relationship pour spécifier explicitement les règles de suppression et les relations inverses.
@Model
class Book {
var title: String
var author: Author?
init(title: String) { self.title = title }
}Règles de suppression
Les règles de suppression déterminent ce qui arrive aux objets associés lorsque l’objet parent est supprimé : .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] = []Relation un-à-plusieurs
Une relation un-à-plusieurs se déclare comme une propriété tableau du côté « un ».
@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 }
}Relations plusieurs-à-plusieurs
Déclarez des tableaux des deux côtés pour créer une relation plusieurs-à-plusieurs.
@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 remplace NSFetchRequest dans SwiftData. Configurez-le avec un prédicat, un tri et une limite de récupération.
var descriptor = FetchDescriptor<Book>(
predicate: #Predicate { $0.title.contains("Swift") },
sortBy: [SortDescriptor(\Book.title)]
)
descriptor.fetchLimit = 10
let books = try context.fetch(descriptor)Tri avec SortDescriptor
Transmettez un tableau de SortDescriptor à FetchDescriptor pour effectuer un tri sur plusieurs colonnes.
let descriptor = FetchDescriptor<Item>(
sortBy: [
SortDescriptor(\Item.priority, order: .reverse),
SortDescriptor(\Item.name)
]
)Compter sans récupérer les données
Utilisez context.fetchCount pour compter les enregistrements correspondants sans charger tous les objets en mémoire.
let descriptor = FetchDescriptor<Book>(
predicate: #Predicate { $0.rating > 4 }
)
let count = try context.fetchCount(descriptor)
print("High-rated books: \(count)")Préchargement des relations
Définissez relationshipKeyPathsForPrefetching sur un FetchDescriptor pour charger de manière anticipée les objets associés.
var descriptor = FetchDescriptor<Author>()
descriptor.relationshipKeyPathsForPrefetching = [\Author.books]
let authors = try context.fetch(descriptor)@Query avec des options de type FetchDescriptor
La macro @Query prend en charge les mêmes options de tri et de prédicat que FetchDescriptor.
@Query(
filter: #Predicate<Book> { $0.author?.name == "Apple" },
sort: \Book.title
)
var books: [Book]Opérations par lots
SwiftData prend en charge les suppressions par lots via context.delete(model:where:) pour effectuer efficacement des opérations en masse.
try context.delete(model: Book.self, where: #Predicate { $0.rating < 2 })Vérification rapide
Quel type SwiftData remplace NSFetchRequest pour récupérer des objets @Model avec filtrage et tri ?
Récapitulatif de la leçon
Déclarez les relations avec @Relationship(deleteRule:) sur les classes @Model. Utilisez FetchDescriptor avec #Predicate et SortDescriptor pour interroger les données. Utilisez fetchCount pour compter les éléments et la suppression par lots pour les supprimer en masse.
Questions Fréquemment Posées
La leçon « Relations et FetchDescriptor » est-elle gratuite ?
Oui — le texte complet de « Relations et FetchDescriptor » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Relations et FetchDescriptor » ?
Modéliser des relations un-à-plusieurs et effectuer des requêtes avec FetchDescriptor. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Swift Academy ?
Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Relations et FetchDescriptor » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?
Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Pile Core Data : configuration de NSPersistentContainer
- SwiftData @Model et ModelContext
- Relations et FetchDescriptor
- Migrations légères et synchronisation CloudKit