SwiftUI vs UIKit
Comparaison approfondie entre SwiftUI, le framework déclaratif moderne d'Apple, et UIKit, éprouvé de longue date. Quel framework choisir en 2025 ?
Framework de persistance d'Apple éprouvé, avec 20 ans de maturité
WWDC 2023 : macro @Model pour une persistance sans boilerplate
| Catégorie | Core Data | SwiftData |
|---|---|---|
| Performance | 9/10 | 9/10 |
| Facilité d'apprentissage | 4/10 | 9/10 |
| Écosystème | 9/10 | 6/10 |
| Communauté | 9/10 | 5/10 |
| Marché de l'emploi | 8/10 | 6/10 |
| Pérennité | 6/10 | 10/10 |
// Core Data - CRUD d'une liste de tâches
import CoreData
import SwiftUI
// Sous-classe 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 d'une liste de tâches
import SwiftData
import SwiftUI
// Macro @Model — zéro 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()
}
}
// Vue SwiftUI — mise à jour automatique via @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("Nouvelle tâche...", text: $newTitle)
Button("Ajouter") {
guard !newTitle.isEmpty else { return }
context.insert(TodoItem(title: newTitle))
newTitle = ""
}
}
}
}Si vous ciblez iOS 17+, commencez avec SwiftData — moins de code, moins d'erreurs, meilleure intégration avec SwiftUI. Pour le support d'anciens appareils, des migrations complexes ou une base Core Data de production importante, préférez Core Data. Les deux partageant la même infrastructure, ils peuvent théoriquement être utilisés ensemble.
Obtenir une consultation gratuiteÀ long terme, oui — c'est la direction dans laquelle Apple investit. Mais le retrait de Core Data prendra des années : les projets existants continueront d'être supportés.