swift-core-data
from pluginagentmarketplace/custom-plugin-swift
Swift development plugin for Claude Code
2 stars0 forksUpdated Jan 5, 2026
npx skills add https://github.com/pluginagentmarketplace/custom-plugin-swift --skill swift-core-dataSKILL.md
Swift Core Data Skill
Data persistence framework knowledge for Core Data and SwiftData in Apple platforms.
Prerequisites
- Xcode 15+ installed
- Understanding of object graphs
- Basic SQL concepts helpful
Parameters
parameters:
framework:
type: string
enum: [core_data, swift_data]
default: swift_data
description: Persistence framework
cloudkit_sync:
type: boolean
default: false
lightweight_migration:
type: boolean
default: true
store_type:
type: string
enum: [sqlite, in_memory, binary]
default: sqlite
Topics Covered
Core Data vs SwiftData
| Feature | Core Data | SwiftData |
|---|---|---|
| Min iOS | 3.0+ | 17.0+ |
| Definition | .xcdatamodeld | @Model macro |
| Threading | Manual (contexts) | Actor-based |
| Fetch | NSFetchRequest | #Predicate |
| Learning Curve | Steep | Gentle |
Core Data Stack
| Component | Purpose |
|---|---|
| NSPersistentContainer | Encapsulates stack |
| NSManagedObjectContext | Working area for objects |
| NSManagedObjectModel | Schema definition |
| NSPersistentStoreCoordinator | Store management |
SwiftData Components
| Component | Purpose |
|---|---|
| ModelContainer | Schema + store |
| ModelContext | Working area |
| @Model | Entity macro |
| @Query | Fetch in SwiftUI |
Code Examples
SwiftData (iOS 17+)
import SwiftData
// MARK: - Model Definition
@Model
final class Task {
var title: String
var notes: String
var dueDate: Date?
var isCompleted: Bool
var priority: Priority
var createdAt: Date
@Relationship(deleteRule: .cascade, inverse: \Subtask.parentTask)
var subtasks: [Subtask] = []
@Relationship(inverse: \Tag.tasks)
var tags: [Tag] = []
init(title: String, notes: String = "", dueDate: Date? = nil, priority: Priority = .medium) {
self.title = title
self.notes = notes
self.dueDate = dueDate
self.isCompleted = false
self.priority = priority
self.createdAt = Date()
}
}
@Model
final class Subtask {
var title: String
var isCompleted: Bool
var parentTask: Task?
init(title: String, parentTask: Task? = nil) {
self.title = title
self.isCompleted = false
self.parentTask = parentTask
}
}
@Model
final class Tag {
@Attribute(.unique) var name: String
var color: String
var tasks: [Task] = []
init(name: String, color: String = "#007AFF") {
self.name = name
self.color = color
}
}
enum Priority: String, Codable, CaseIterable {
case low, medium, high, urgent
}
// MARK: - Container Setup
@main
struct TaskApp: App {
let container: ModelContainer
init() {
let schema = Schema([Task.self, Subtask.self, Tag.self])
let config = ModelConfiguration(
schema: schema,
isStoredInMemoryOnly: false,
cloudKitDatabase: .none
)
do {
container = try ModelContainer(for: schema, configurations: config)
} catch {
fatalError("Failed to create ModelContainer: \(error)")
}
}
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(container)
}
}
// MARK: - SwiftUI Integration
struct TaskListView: View {
@Environment(\.modelContext) private var context
@Query(sort: \Task.dueDate) private var tasks: [Task]
var body: some View {
List {
ForEach(tasks) { task in
TaskRow(task: task)
}
.onDelete(perform: deleteTasks)
}
}
private func deleteTasks(at offsets: IndexSet) {
for index in offsets {
context.delete(tasks[index])
}
}
}
// Query with predicate
struct IncompleteTasks: View {
@Query(filter: #Predicate<Task> { !$0.isCompleted },
sort: [SortDescriptor(\Task.priority, order: .reverse)])
private var tasks: [Task]
var body: some View {
List(tasks) { task in
Text(task.title)
}
}
}
Core Data (Traditional)
import CoreData
// MARK: - Core Data Stack
final class CoreDataStack {
static let shared = CoreDataStack()
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { _, error in
if let error = error as NSError? {
fatalError("Core Data error: \(error), \(error.userInfo)")
}
}
container.viewContext.automaticallyMergesChangesFromParent = true
container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
return container
}()
var viewContext: NSManagedObjectContext {
persistentContainer.viewContext
}
func newBackgroundContext() -> NSManagedObjectContext {
let context = persistentCo
...
Repository Stats
Stars2
Forks0
LicenseOther