Swift Academy · Lección

Relaciones y descriptores de búsqueda

Modele relaciones uno a muchos y realice consultas con FetchDescriptor.

Lección 3 de 413 pasos

Relaciones y descriptores de búsqueda es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

Relaciones en SwiftData

Declare relaciones entre clases @Model mediante propiedades de Swift. SwiftData infiere el tipo de relación.

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

Atributo @Relationship

Use @Relationship para especificar explícitamente las reglas de eliminación y las relaciones inversas.

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

Reglas de eliminación

Las reglas de eliminación controlan qué ocurre con los objetos relacionados cuando se elimina el objeto principal: .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] = []

Relación uno a varios

Una relación uno a varios se declara como una propiedad de tipo array en el lado «uno».

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

Relaciones varios a varios

Declare arrays en ambos lados para establecer una relación varios a varios.

@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 reemplaza a NSFetchRequest en SwiftData. Configúrelo con un predicado, una ordenación y un límite de resultados.

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

Ordenación con SortDescriptor

Pase un array de SortDescriptor a FetchDescriptor para ordenar por varias columnas.

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

Recuento sin realizar búsquedas

Use context.fetchCount para contar los registros coincidentes sin cargar todos los objetos en memoria.

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

Precarga de relaciones

Establezca relationshipKeyPathsForPrefetching en un FetchDescriptor para cargar anticipadamente los objetos relacionados.

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

@Query con opciones similares a FetchDescriptor

La macro @Query admite las mismas opciones de ordenación y predicado que FetchDescriptor.

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

Operaciones por lotes

SwiftData admite eliminaciones por lotes mediante context.delete(model:where:) para realizar operaciones masivas de forma eficiente.

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

Comprobación rápida

¿Qué tipo de SwiftData reemplaza a NSFetchRequest para buscar objetos @Model con filtros y ordenación?

Repaso de la lección

Declare relaciones con @Relationship(deleteRule:) en las clases @Model. Use FetchDescriptor con #Predicate y SortDescriptor para consultar datos. Use fetchCount para realizar recuentos y la eliminación por lotes para eliminar grandes cantidades de datos.

Gratis para empezar

Aprende Swift con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
122
Lecciones
409

Preguntas frecuentes

¿La lección «Relaciones y descriptores de búsqueda» es gratis?

Sí — el texto completo de «Relaciones y descriptores de búsqueda» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Relaciones y descriptores de búsqueda»?

Modele relaciones uno a muchos y realice consultas con FetchDescriptor. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Relaciones y descriptores de búsqueda»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Stack de Core Data: configuración de NSPersistentContainer
  2. @Model y ModelContext de SwiftData
  3. Relaciones y descriptores de búsqueda
  4. Migraciones ligeras y sincronización con CloudKit
← Volver a Swift Academy