SwiftUI مقابل UIKit
مقارنة شاملة بين إطار عمل Apple الحديث التصريحي SwiftUI وUIKit المُختبَر ميدانيًا. أي إطار عمل يجب اختياره في 2025؟
إطار عمل استمرارية من Apple مُختبر ميدانيًا بنضج عمره 20 عامًا
WWDC 2023: أصلي بلغة Swift، استمرارية بلا شيفرة نمطية عبر ماكرو @Model
| الفئة | Core Data | SwiftData |
|---|---|---|
| الأداء | 9/10 | 9/10 |
| سهولة التعلّم | 4/10 | 9/10 |
| النظام البيئي | 9/10 | 6/10 |
| المجتمع | 9/10 | 5/10 |
| سوق العمل | 8/10 | 6/10 |
| الاستدامة المستقبلية | 6/10 | 10/10 |
// Core Data - عمليات CRUD لقائمة مهام
import CoreData
import SwiftUI
// فئة فرعية من NSManagedObject
@objc(TodoItem)
class TodoItem: NSManagedObject {
@NSManaged var id: UUID
@NSManaged var title: String
@NSManaged var isCompleted: Bool
@NSManaged var createdAt: Date
}
// View Model
class TodoViewModel: ObservableObject {
let container: NSPersistentContainer
@Published var todos: [TodoItem] = []
init() {
container = NSPersistentContainer(name: "TodoModel")
container.loadPersistentStores { _, error in
if let error { fatalError("Core Data load failed: \(error)") }
}
fetchTodos()
}
func fetchTodos() {
let request = NSFetchRequest<TodoItem>(entityName: "TodoItem")
request.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: false)]
do {
todos = try container.viewContext.fetch(request)
} catch {
print("Fetch error: \(error)")
}
}
func addTodo(title: String) {
let todo = TodoItem(context: container.viewContext)
todo.id = UUID()
todo.title = title
todo.isCompleted = false
todo.createdAt = Date()
saveContext()
}
func toggleTodo(_ todo: TodoItem) {
todo.isCompleted.toggle()
saveContext()
}
private func saveContext() {
try? container.viewContext.save()
fetchTodos()
}
}// SwiftData - عمليات CRUD لقائمة مهام
import SwiftData
import SwiftUI
// ماكرو @Model — بلا شيفرة نمطية!
@Model
class TodoItem {
var id: UUID
var title: String
var isCompleted: Bool
var createdAt: Date
init(title: String) {
self.id = UUID()
self.title = title
self.isCompleted = false
self.createdAt = Date()
}
}
// SwiftUI View — تحديث تلقائي عبر @Query
struct TodoListView: View {
@Environment(\.modelContext) private var context
@Query(sort: \.createdAt, order: .reverse) private var todos: [TodoItem]
@State private var newTitle = ""
var body: some View {
List {
ForEach(todos) { todo in
HStack {
Image(systemName: todo.isCompleted ? "checkmark.circle.fill" : "circle")
.foregroundStyle(todo.isCompleted ? .green : .gray)
.onTapGesture { todo.isCompleted.toggle() }
Text(todo.title)
.strikethrough(todo.isCompleted)
}
}
.onDelete { indexSet in
indexSet.forEach { context.delete(todos[$0]) }
}
}
.toolbar {
TextField("Yeni todo...", text: $newTitle)
Button("Ekle") {
guard !newTitle.isEmpty else { return }
context.insert(TodoItem(title: newTitle))
newTitle = ""
}
}
}
}إذا كنت تستهدف iOS 17+، ابدأ بـ SwiftData — كود أقل، أخطاء أقل، وتكامل أفضل مع SwiftUI. إذا كان لديك دعم للأجهزة القديمة، أو سيناريوهات ترحيل معقدة، أو قاعدة Core Data إنتاجية كبيرة، اختر Core Data. نظريًا يمكن استخدامهما معًا لأنهما يشتركان في نفس البنية التحتية.
احصل على استشارة مجانيةعلى المدى الطويل نعم، هذا هو اتجاه استثمار Apple. لكن إزالة Core Data ستستغرق سنوات — المشاريع القائمة على Core Data ستظل مدعومة.