Core Data vs SwiftData Karşılaştırması

20 yıllık olgunluğuyla Apple'ın battle-tested persistence çerçevesi

VS
SwiftData

WWDC 2023: Swift-native, @Model macro ile sıfır boilerplate persistence

8 dk okumaiOS

Puan Karşılaştırması

Grafik yükleniyor...

Detaylı Puanlama

Performans
Core Data9/10
SwiftData9/10
Öğrenme Kolaylığı
Core Data4/10
SwiftData9/10
Ekosistem
Core Data9/10
SwiftData6/10
Topluluk
Core Data9/10
SwiftData5/10
İş Pazarı
Core Data8/10
SwiftData6/10
Gelecek
Core Data6/10
SwiftData10/10

Artıları & Eksileri

Core Data

Artıları

  • iOS 3'ten beri mevcut — son derece stabil ve belgelenmiş
  • NSFetchedResultsController ile UITableView/UICollectionView entegrasyonu mükemmel
  • iCloud sync (NSPersistentCloudKitContainer) ile bulut senkronizasyonu
  • Karmaşık ilişki ve migration senaryoları için olgun destek
  • Performans ayarı için faulthing, batch operations gibi gelişmiş özellikler
  • Core Spotlight entegrasyonu ile içerik aranabilir
  • SQLite, Binary, In-Memory store tipleri
  • Geniş topluluk bilgisi ve Stack Overflow kaynakları

Eksileri

  • NSManagedObject ile verbose kod — boilerplate çok fazla
  • Thread safety zor — NSManagedObjectContext'i doğru yönetmek karmaşık
  • Öğrenme eğrisi dik — NSFetchRequest, NSPredicate sözdizimi
  • Hata mesajları geliştiriciye pek yardımcı değil
  • Modern Swift ile çalışmak için wrapper gerekiyor

En Uygun

iOS 16 altı destek gerektiren uygulamalarKarmaşık veri ilişkileri ve migration gereksinimleriiCloud senkronizasyonu kritik uygulamalarBüyük veri setleri ve gelişmiş fetch optimizasyonuMevcut Core Data projelerini sürdürme

SwiftData

Artıları

  • @Model macro ile tek satır veri modeli tanımlama — sıfır boilerplate
  • SwiftUI ile native entegrasyon — @Query ile otomatik UI güncelleme
  • Swift Concurrency ile uyumlu — async/await ile doğal çalışma
  • Core Data'nın üstünde çalışıyor — aynı SQLite altyapısı, aynı performans
  • iCloud senkronizasyonu yapılandırması çok daha basit
  • Type-safe predicate ve sort descriptor'lar
  • Minimal migration API — basit şema değişiklikleri otomatik

Eksileri

  • iOS 17+ gerektirir — henüz yaygın kullanım için erken
  • Karmaşık migration senaryolarında Core Data kadar kontrol yok
  • Hâlâ olgunlaşıyor — her WWDC ile büyük değişiklikler gelebilir
  • Stack Overflow/topluluk kaynakları Core Data'ya kıyasla çok az
  • Bazı gelişmiş Core Data özelliklerine henüz eşdeğer yok

En Uygun

iOS 17+ hedefleyen yeni projelerSwiftUI uygulamaları ile persistence entegrasyonuBasit-orta karmaşıklıkta veri modelleriHızlı prototipleme ve küçük uygulamalarModern Swift ekiplerinin yeni projeleri

Kod Karşılaştırması

Core Data
// Core Data - Todo listesi CRUD
import CoreData
import SwiftUI

// NSManagedObject subclass
@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
// SwiftData - Todo listesi CRUD
import SwiftData
import SwiftUI

// @Model macro — boilerplate yok!
@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 otomatik güncelleme
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 = ""
            }
        }
    }
}

Sonuç

iOS 17+ hedefliyorsanız SwiftData ile başlayın — daha az kod, daha az hata, daha iyi SwiftUI entegrasyonu. Eski cihaz desteği, karmaşık migration veya büyük production Core Data tabanı varsa Core Data tercih edin. İkisi aynı altyapıyı paylaştığından teorik olarak birlikte kullanılabilir.

SSS

Sıkça Sorulan Sorular

Uzun vadede evet, Apple'ın yatırımı bu yönde. Ancak Core Data'nın kaldırılması yıllar alır — mevcut Core Data projeleri hâlâ desteklenecek.

İlgili Blog Yazıları

Tüm Yazıları Gör

İlgili Projeler

Tüm Projeleri Gör

Bunu da begenebilirsiniz