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] = []

علاقة واحد إلى متعدد

يُصرَّح عن علاقة واحد إلى متعدد باعتبارها خاصية مصفوفة في جانب «one».

@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

يحل FetchDescriptor محل NSFetchRequest في SwiftData. هيّئوه باستخدام predicate والفرز وحدّ الجلب.

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 خيارات الفرز وpredicate نفسها التي يدعمها 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مكدس Core Data: إعداد NSPersistentContainer
  2. ‏SwiftData @Model وModelContext
  3. العلاقات وواصفات الجلب
  4. الترحيلات الخفيفة والمزامنة مع CloudKit
← العودة إلى Swift Academy