SwiftUI vs UIKit
Comparativa exhaustiva entre el framework declarativo moderno de Apple, SwiftUI, y el probado en batalla UIKit. ¿Qué framework deberías elegir en 2025?
El framework de persistencia probado en producción de Apple, con 20 años de madurez
WWDC 2023: persistencia nativa de Swift con la macro @Model, sin boilerplate
| Categoría | Core Data | SwiftData |
|---|---|---|
| Rendimiento | 9/10 | 9/10 |
| Facilidad de aprendizaje | 4/10 | 9/10 |
| Ecosistema | 9/10 | 6/10 |
| Comunidad | 9/10 | 5/10 |
| Mercado laboral | 8/10 | 6/10 |
| A prueba de futuro | 6/10 | 10/10 |
// Core Data - CRUD de una lista de tareas
import CoreData
import SwiftUI
// Subclase de 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 de una lista de tareas
import SwiftData
import SwiftUI
// Macro @Model — ¡sin 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()
}
}
// Vista SwiftUI — actualización automática con @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 = ""
}
}
}
}Si tu objetivo es iOS 17+, empieza con SwiftData — menos código, menos errores y una mejor integración con SwiftUI. Si necesitas soporte para dispositivos antiguos, migraciones complejas o cuentas con una gran base de Core Data en producción, opta por Core Data. Al compartir la misma infraestructura, en teoría pueden usarse juntos.
Solicita una consultoría gratuitaA largo plazo, sí — es la dirección en la que Apple está invirtiendo. Sin embargo, la retirada de Core Data llevará años — los proyectos existentes de Core Data seguirán recibiendo soporte.