SwiftUI vs UIKit
Der umfassende Vergleich zwischen Apples modernem deklarativem Framework SwiftUI und dem bewährten UIKit. Welches Framework sollten Sie 2025 wählen?
Apples production-erprobtes Persistenz-Framework mit 20 Jahren Reife
WWDC 2023: Swift-native Persistenz mit dem @Model-Makro ohne Boilerplate
| Kategorie | Core Data | SwiftData |
|---|---|---|
| Performance | 9/10 | 9/10 |
| Erlernbarkeit | 4/10 | 9/10 |
| Ökosystem | 9/10 | 6/10 |
| Community | 9/10 | 5/10 |
| Arbeitsmarkt | 8/10 | 6/10 |
| Zukunftssicherheit | 6/10 | 10/10 |
// Core Data - Todo-Liste CRUD
import CoreData
import SwiftUI
// NSManagedObject-Subklasse
@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-Liste CRUD
import SwiftData
import SwiftUI
// @Model-Makro — kein Boilerplate!
@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 mit automatischem Update
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("Neues Todo...", text: $newTitle)
Button("Hinzufügen") {
guard !newTitle.isEmpty else { return }
context.insert(TodoItem(title: newTitle))
newTitle = ""
}
}
}
}Wer iOS 17+ als Ziel hat, sollte mit SwiftData starten — weniger Code, weniger Fehler, bessere SwiftUI-Integration. Bei Support für ältere Geräte, komplexen Migrationen oder einer großen bestehenden Core-Data-Basis bleibt Core Data die richtige Wahl. Da beide dieselbe Infrastruktur nutzen, lassen sie sich theoretisch auch kombinieren.
Kostenlose Beratung erhaltenLangfristig ja, das ist die Richtung, in die Apple investiert. Die Abschaffung von Core Data wird jedoch Jahre dauern — bestehende Core-Data-Projekte werden weiterhin unterstützt.