يقدم إصدار 2027 من SwiftData دعمًا للأنواع المخصصة والجهات الخارجية المستمرة عبر Codableبالإضافة إلى القدرة على تنظيم البيانات في أقسام قائمة SwiftUI. كما أنه يضيف إمكانات جديدة لمراقبة تغييرات مخزن البيانات من خلاله ResultsObserver و HistoryObserver.
Codable تحل السمات أحد القيود في SwiftData عند دمج أنواع مخصصة أو أنواع خارجية في نموذج. نظرًا لأنك لا تتحكم في نوع مرجع جهة خارجية، فلا يمكنك وضع علامة عليه @Model. ونتيجة لذلك، لا يمكن تضمينه مباشرة في النموذج، لأن SwiftData غير قادر على إنشاء مخطط له.
مع الإصدار الجديد، يمكن لنوع الطرف الثالث العمل بسلاسة مع SwiftData طالما أنه يتوافق مع Codable بروتوكول. في المثال التالي، ExLocation هو نوع قيمة لا نتحكم فيه، ويتم إنشاؤه إما من iOS SDK أو من مكتبة تابعة لجهة خارجية:
struct ExLocation: Codable {
...
}
@Model
final class Destination {
var title: String
@Attribute(.codable) var locationInfo: ExLocation
init(title: String, locationInfo: ExLocation) {
self.title = title
self.locationInfo = locationInfo
}
}
باستخدام أ Codable الملكية في نموذج SwiftData تأتي مع بعض القيود. وعلى وجه الخصوص، لا يمكن استخدام هذه الخصائص للتصفية أو الفرز، حيث يتم التعامل معها على أنها قيم غير شفافة. بالإضافة إلى ذلك، لا تؤدي التغييرات التي يتم إجراؤها على النوع الأساسي، مثل إضافة خاصية جديدة، إلى تشغيل عمليات الترحيل التلقائي. بسبب هذه القيود، باستخدام .codable بالنسبة للأنواع التي تتحكم فيها لا تعتبر ممارسة جيدة. في تلك الحالات، من العملي حتى الآن تعريفها على أنها @Model أنواع بدلا من ذلك.
لدعم عمليات جلب المقاطع، يقوم SwiftData بتوسيع نطاق @Query مجمع الملكية مع الجديد sectionBy المعلمة، مما يسمح بتحديد مسار رئيسي على النوع الذي تم جلبه لاستخدامه في التجميع:
@Query(sort: \Trip.startDate, sectionBy: \.destination)
var trips: [Trip]
اجتياز أ sectionBy الوسيطة ستجعل الكائن الملتف، _trips، فضح أ sections الخاصية التي يمكن استخدامها للتكرار عليها:
List {
ForEach (_trips.sections) { section in
Section(section.id) {
ForEach(section) { trip in
TripListItem(trip: trip)
}
}
}
}
يقدم SwiftData 2027 أيضًا ResultObserver، والذي يوفر آلية مشابهة ل @Query ولكن يمكن استخدامها خارج SwiftUI. وهذا يجعله مناسبًا لسياقات مثل فئات الكائنات التي تحتاج إلى إعادة حساب القيم استجابة لتغيرات البيانات، أو لبيئات مثل التطبيقات المستندة إلى SceneKit التي لا تستخدم SwiftUI على الإطلاق. ResultObserver مبني على إطار المراقبة ويدعم نفس الميزات مثل @Queryبما في ذلك الفرز والتصفية والتقسيم.
توضح المقتطفات التالية كيفية تعريف كائن وحدة التحكم الذي يستخدمه ResultObserver لمراقبة التغييرات في كيانات الرحلة:
@Observable @MainActor final class MapCameraController {
private let ResultObserver: ResultObserver<Trip>
...
private var token: ObservationTracking.Token?
init(modelContext: ModelContext) throws {
resultObserver = try ResultObserver<Trip>(modelContext: modelContext)
token = withContinuosObservation(option: [.didSet]) { [weak self] event in
...
}
}
}
بالمثل ResultsObserver, HistoryObserver يراقب التاريخ المستمر لمخزن البيانات الخاص بك ويسمح للتعليمات البرمجية الخاصة بك بالتفاعل عند إضافة معاملات جديدة. يعد هذا مفيدًا بشكل خاص للحفاظ على مزامنة أجزاء من مخزن البيانات مع الأنظمة الأخرى، مثل الخوادم البعيدة. HistoryObserver يعرض ما يمكن ملاحظته eventCounter الخاصية التي تزداد كلما أصبحت المعاملات الجديدة متاحة في السجل المستمر. من خلال مراقبة هذه الخاصية، يمكن استخدام التطبيق ModelContext.fetchHistory API لاسترداد أحدث التغييرات.
تتوفر إصدارات SwiftData لمنصة Apple لعام 2027 في الإصدار التجريبي من Xcode 27.
