SwiftUI vs UIKit
Apple'ın modern deklaratif framework'ü SwiftUI ile battle-tested UIKit arasındaki kapsamlı karşılaştırma. 2025'te hangi framework'ü seçmelisiniz?
20 yıllık olgunluğuyla Apple'ın battle-tested persistence çerçevesi
WWDC 2023: Swift-native, @Model macro ile sıfır boilerplate persistence
// 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 - 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 = ""
}
}
}
}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.
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.