{"id":"77785756-87cc-4978-9a16-f0741c724d01","shortId":"btDbXP","kind":"skill","title":"Swiftdata","tagline":"Swift Ios Skills skill by Dpearson2699","description":"# SwiftData\n\nPersist, query, and manage structured data in iOS 26+ apps using SwiftData\nwith Swift 6.3.\n\n## Contents\n\n- [Model Definition](#model-definition)\n- [ModelContainer Setup](#modelcontainer-setup)\n- [CRUD Operations](#crud-operations)\n- [@Query in SwiftUI](#query-in-swiftui)\n- [#Predicate](#predicate)\n- [FetchDescriptor](#fetchdescriptor)\n- [Schema Versioning and Migration](#schema-versioning-and-migration)\n- [Concurrency (@ModelActor)](#concurrency-modelactor)\n- [SwiftUI Integration](#swiftui-integration)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Model Definition\n\nApply `@Model` to a **class** (not struct). Generates `PersistentModel`, `Observable`, `Sendable`.\n\n```swift\n@Model\nclass Trip {\n    var name: String\n    var destination: String\n    var startDate: Date\n    var endDate: Date\n    var isFavorite: Bool = false\n    @Attribute(.externalStorage) var imageData: Data?\n    @Relationship(deleteRule: .cascade, inverse: \\LivingAccommodation.trip)\n    var accommodation: LivingAccommodation?\n    @Transient var isSelected: Bool = false  // Always provide default\n\n    init(name: String, destination: String, startDate: Date, endDate: Date) {\n        self.name = name; self.destination = destination\n        self.startDate = startDate; self.endDate = endDate\n    }\n}\n```\n\n**@Attribute options**: `.externalStorage`, `.unique`, `.spotlight`, `.allowsCloudEncryption`, `.preserveValueOnDeletion` (iOS 18+), `.ephemeral`, `.transformable(by:)`. Rename: `@Attribute(originalName: \"old_name\")`.\n\n**@Relationship**: `deleteRule:` `.cascade`/`.nullify`(default)/`.deny`/`.noAction`. Specify `inverse:` for reliable behavior. Unidirectional (iOS 18+): `inverse: nil`.\n\n**#Unique (iOS 18+)**: `#Unique<Person>([\\.firstName, \\.lastName])` -- compound uniqueness.\n\n**Inheritance (iOS 26+)**: `@Model class BusinessTrip: Trip { var company: String }`.\n\nSupported types: `Bool`, `Int`/`UInt` variants, `Float`, `Double`, `String`, `Date`, `Data`, `URL`, `UUID`, `Decimal`, `Array`, `Dictionary`, `Set`, `Codable` enums, `Codable` structs (composite, iOS 18+), relationships to `@Model` classes.\n\n## ModelContainer Setup\n\n```swift\n// Basic\nlet container = try ModelContainer(for: Trip.self, LivingAccommodation.self)\n\n// Configured\nlet config = ModelConfiguration(\"Store\", isStoredInMemoryOnly: false,\n    groupContainer: .identifier(\"group.com.example.app\"),\n    cloudKitDatabase: .private(\"iCloud.com.example.app\"))\nlet container = try ModelContainer(for: Trip.self, configurations: config)\n\n// With migration plan\nlet container = try ModelContainer(for: SchemaV2.Trip.self,\n    migrationPlan: TripMigrationPlan.self)\n\n// In-memory (previews/tests)\nlet container = try ModelContainer(for: Trip.self,\n    configurations: ModelConfiguration(isStoredInMemoryOnly: true))\n```\n\n## CRUD Operations\n\n```swift\n// CREATE\nlet trip = Trip(name: \"Summer\", destination: \"Paris\", startDate: .now, endDate: .now + 86400*7)\nmodelContext.insert(trip)\ntry modelContext.save()  // or rely on autosave\n\n// READ\nlet trips = try modelContext.fetch(FetchDescriptor<Trip>(\n    predicate: #Predicate { $0.destination == \"Paris\" },\n    sortBy: [SortDescriptor(\\.startDate)]))\n\n// UPDATE -- modify properties directly; autosave handles persistence\ntrip.destination = \"Rome\"\n\n// DELETE\nmodelContext.delete(trip)\ntry modelContext.delete(model: Trip.self, where: #Predicate { $0.isFavorite == false })\n\n// TRANSACTION (atomic)\ntry modelContext.transaction {\n    modelContext.insert(trip); trip.isFavorite = true\n}\n```\n\n## @Query in SwiftUI\n\n```swift\nstruct TripListView: View {\n    @Query(filter: #Predicate<Trip> { $0.isFavorite == true },\n           sort: \\.startDate, order: .reverse)\n    private var favorites: [Trip]\n\n    var body: some View { List(favorites) { trip in Text(trip.name) } }\n}\n\n// Dynamic query via init\nstruct SearchView: View {\n    @Query private var trips: [Trip]\n    init(search: String) {\n        _trips = Query(filter: #Predicate<Trip> { trip in\n            search.isEmpty || trip.name.localizedStandardContains(search)\n        }, sort: [SortDescriptor(\\.name)])\n    }\n    var body: some View { List(trips) { trip in Text(trip.name) } }\n}\n\n// FetchDescriptor query\nstruct RecentView: View {\n    static var desc: FetchDescriptor<Trip> {\n        var d = FetchDescriptor<Trip>(sortBy: [SortDescriptor(\\.startDate)])\n        d.fetchLimit = 5; return d\n    }\n    @Query(RecentView.desc) private var recent: [Trip]\n    var body: some View { List(recent) { trip in Text(trip.name) } }\n}\n```\n\n## #Predicate\n\n```swift\n#Predicate<Trip> { $0.destination.localizedStandardContains(\"paris\") }  // String\n#Predicate<Trip> { $0.startDate > Date.now }                            // Date\n#Predicate<Trip> { $0.isFavorite && $0.destination != \"Unknown\" }       // Compound\n#Predicate<Trip> { $0.accommodation?.name != nil }                      // Optional\n#Predicate<Trip> { $0.tags.contains { $0.name == \"adventure\" } }        // Collection\n```\n\nSupported: `==`, `!=`, `<`, `<=`, `>`, `>=`, `&&`, `||`, `!`, `contains()`, `allSatisfy()`, `filter()`, `starts(with:)`, `localizedStandardContains()`, `caseInsensitiveCompare()`, arithmetic, ternary, optional chaining, nil coalescing, type casting. **Not supported**: flow control, nested declarations, arbitrary method calls.\n\n## FetchDescriptor\n\n```swift\nvar d = FetchDescriptor<Trip>(predicate: ..., sortBy: [...])\nd.fetchLimit = 20; d.fetchOffset = 0\nd.includePendingChanges = true\nd.propertiesToFetch = [\\.name, \\.startDate]\nd.relationshipKeyPathsForPrefetching = [\\.accommodation]\nlet trips = try modelContext.fetch(d)\nlet count = try modelContext.fetchCount(d)\nlet ids = try modelContext.fetchIdentifiers(d)\ntry modelContext.enumerate(d, batchSize: 1000) { trip in trip.isProcessed = true }\n```\n\n## Schema Versioning and Migration\n\n```swift\nenum SchemaV1: VersionedSchema {\n    static var versionIdentifier = Schema.Version(1, 0, 0)\n    static var models: [any PersistentModel.Type] { [Trip.self] }\n    @Model class Trip { var name: String; init(name: String) { self.name = name } }\n}\n\nenum SchemaV2: VersionedSchema {\n    static var versionIdentifier = Schema.Version(2, 0, 0)\n    static var models: [any PersistentModel.Type] { [Trip.self] }\n    @Model class Trip {\n        var name: String; var startDate: Date?  // New property\n        init(name: String) { self.name = name }\n    }\n}\n\nenum TripMigrationPlan: SchemaMigrationPlan {\n    static var schemas: [any VersionedSchema.Type] { [SchemaV1.self, SchemaV2.self] }\n    static var stages: [MigrationStage] { [migrateV1toV2] }\n    static let migrateV1toV2 = MigrationStage.lightweight(\n        fromVersion: SchemaV1.self, toVersion: SchemaV2.self)\n}\n\n// Custom migration for data transformation\nstatic let migrateV2toV3 = MigrationStage.custom(\n    fromVersion: SchemaV2.self, toVersion: SchemaV3.self,\n    willMigrate: nil,\n    didMigrate: { context in\n        let trips = try context.fetch(FetchDescriptor<SchemaV3.Trip>())\n        for trip in trips { trip.displayName = trip.name.capitalized }\n        try context.save()\n    })\n```\n\nLightweight handles: adding optional/defaulted properties, renaming (`originalName`), removing properties, adding model types.\n\n## Concurrency (@ModelActor)\n\n```swift\n@ModelActor\nactor DataHandler {\n    func importTrips(_ records: [TripRecord]) throws {\n        for r in records {\n            modelContext.insert(Trip(name: r.name, destination: r.dest,\n                                    startDate: r.start, endDate: r.end))\n        }\n        try modelContext.save()  // Always save explicitly in @ModelActor\n    }\n\n    func process(tripID: PersistentIdentifier) throws {\n        guard let trip = self[tripID, as: Trip.self] else { return }\n        trip.isProcessed = true; try modelContext.save()\n    }\n}\n\nlet handler = DataHandler(modelContainer: container)\ntry await handler.importTrips(records)\n```\n\n**Rules**: `ModelContainer` is `Sendable`. `ModelContext` is NOT -- use on its creating actor. Pass `PersistentIdentifier` (Sendable) across boundaries. Never pass `@Model` objects across actors.\n\n## SwiftUI Integration\n\n```swift\n@main\nstruct MyApp: App {\n    var body: some Scene {\n        WindowGroup { ContentView() }\n            .modelContainer(for: [Trip.self, LivingAccommodation.self])\n    }\n}\n\nstruct DetailView: View {\n    @Environment(\\.modelContext) private var modelContext\n    let trip: Trip\n    var body: some View {\n        Text(trip.name)\n        Button(\"Delete\") { modelContext.delete(trip) }\n    }\n}\n\n#Preview {\n    let config = ModelConfiguration(isStoredInMemoryOnly: true)\n    let container = try! ModelContainer(for: Trip.self, configurations: config)\n    container.mainContext.insert(Trip(name: \"Preview\", destination: \"London\",\n        startDate: .now, endDate: .now + 86400))\n    return TripListView().modelContainer(container)\n}\n```\n\n## Common Mistakes\n\n**1. @Model on struct** -- Use class. `@Model` requires reference semantics.\n\n**2. @Transient without default** -- Always provide default: `@Transient var x: Bool = false`.\n\n**3. Missing .modelContainer** -- @Query returns empty without a container on the view hierarchy.\n\n**4. Passing model objects across actors:**\n```swift\n// WRONG: await handler.process(trip: trip)\n// CORRECT: await handler.process(tripID: trip.persistentModelID)\n```\n\n**5. ModelContext on wrong actor:**\n```swift\n// WRONG: Task.detached { context.fetch(...) }\n// CORRECT: Use @ModelActor for background work\n```\n\n**6. Unsupported #Predicate expressions:**\n```swift\n// WRONG: #Predicate<Trip> { $0.name.uppercased() == \"PARIS\" }\n// CORRECT: #Predicate<Trip> { $0.name.localizedStandardContains(\"paris\") }\n```\n\n**7. Flow control in #Predicate:**\n```swift\n// WRONG: #Predicate<Trip> { for tag in $0.tags { ... } }\n// CORRECT: #Predicate<Trip> { $0.tags.contains { $0.name == \"x\" } }\n```\n\n**8. No save in @ModelActor** -- Always call `try modelContext.save()` explicitly.\n\n**9. ObservableObject with @Model** -- Never use `ObservableObject`/`@Published`. `@Model` generates `Observable`. Use `@Query` in views.\n\n**10. Non-optional relationship without default:**\n```swift\n// WRONG: var accommodation: LivingAccommodation  // crashes on reconstitution\n// CORRECT: var accommodation: LivingAccommodation?\n```\n\n**11. Cascade without inverse** -- Specify `inverse:` for reliable cascade delete behavior.\n\n**12. DispatchQueue for background data work:**\n```swift\n// WRONG: DispatchQueue.global().async { ModelContext(container).fetch(...) }\n// CORRECT: @ModelActor actor Handler { func fetch() throws { ... } }\n```\n\n## Review Checklist\n\n- [ ] Every `@Model` is a class with a designated initializer\n- [ ] All `@Transient` properties have default values\n- [ ] Relationships specify `deleteRule` and `inverse`\n- [ ] `.modelContainer` attached at scene/root view level\n- [ ] `@Query` used for reactive data display in SwiftUI\n- [ ] `#Predicate` uses only supported operators\n- [ ] Background work uses `@ModelActor`\n- [ ] `PersistentIdentifier` used across actor boundaries\n- [ ] Schema changes have `VersionedSchema` + `SchemaMigrationPlan`\n- [ ] Large data uses `@Attribute(.externalStorage)`\n- [ ] CloudKit models use optionals and avoid unique constraints\n- [ ] Explicit `save()` in `@ModelActor` methods\n- [ ] Previews use `ModelConfiguration(isStoredInMemoryOnly: true)`\n- [ ] `@Model` classes accessed from SwiftUI views are on `@MainActor` via `@ModelActor` or MainActor isolation\n\n## References\n\n- See [references/swiftdata-advanced.md](references/swiftdata-advanced.md) for custom data stores, history\n  tracking, CloudKit, Core Data coexistence, composite attributes,\n  model inheritance, undo/redo, and performance patterns.\n- See [references/swiftdata-queries.md](references/swiftdata-queries.md) for @Query variants, FetchDescriptor\n  deep dive, sectioned queries, dynamic queries, and background fetch patterns.\n- See [references/core-data-coexistence.md](references/core-data-coexistence.md) for standalone Core Data patterns\n  and Core Data to SwiftData migration strategies.","tags":["swiftdata","swift","ios","skills","dpearson2699"],"capabilities":["skill","source-dpearson2699","category-swift-ios-skills"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/swiftdata","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under dpearson2699/swift-ios-skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T05:40:37.725Z","embedding":null,"createdAt":"2026-04-18T20:33:31.653Z","updatedAt":"2026-04-22T05:40:37.725Z","lastSeenAt":"2026-04-22T05:40:37.725Z","tsv":"'0':518,563,564,590,591 '0.accommodation':474 '0.destination':323,470 '0.destination.localizedstandardcontains':461 '0.isfavorite':346,366,469 '0.name':480,926 '0.name.localizedstandardcontains':909 '0.name.uppercased':905 '0.startdate':465 '0.tags':922 '0.tags.contains':479,925 '1':562,831 '10':953 '1000':545 '11':972 '12':983 '18':161,184,189,228 '2':589,841 '20':516 '26':17,197 '3':853 '4':866 '5':439,883 '6':898 '6.3':23 '7':306,911 '8':928 '86400':305,824 '9':938 'access':1083 'accommod':126,525,963,970 'across':754,760,870,1050 'actor':684,750,761,871,887,998,1051 'ad':670,677 'adventur':481 'allowscloudencrypt':158 'allsatisfi':485 'alway':133,707,845,933 'app':18,768 'appli':84 'arbitrari':505 'arithmet':491 'array':219 'async':992 'atom':349 'attach':1026 'attribut':115,153,166,1061,1110 'autosav':314,332 'avoid':1068 'await':736,874,879 'background':896,986,1044,1131 'basic':236 'batchsiz':544 'behavior':181,982 'bodi':377,414,449,770,791 'bool':113,131,207,851 'boundari':755,1052 'businesstrip':200 'button':796 'call':507,934 'cascad':122,172,973,980 'caseinsensitivecompar':490 'cast':498 'category-swift-ios-skills' 'chain':494 'chang':1054 'checklist':76,79,1004 'class':88,97,199,232,572,599,836,1009,1082 'cloudkit':1063,1105 'cloudkitdatabas':254 'coalesc':496 'codabl':222,224 'coexist':1108 'collect':482 'common':70,73,829 'common-mistak':72 'compani':203 'composit':226,1109 'compound':193,472 'concurr':60,63,680 'concurrency-modelactor':62 'config':246,264,802,813 'configur':244,263,286,812 'constraint':1070 'contain':238,258,269,281,484,734,807,828,861,994 'container.maincontext.insert':814 'content':24 'contentview':774 'context':653 'context.fetch':658,891 'context.save':667 'control':502,913 'core':1106,1139,1143 'correct':878,892,907,923,968,996 'count':532 'crash':965 'creat':293,749 'crud':35,38,290 'crud-oper':37 'custom':637,1100 'd':433,441,511,530,535,540,543 'd.fetchlimit':438,515 'd.fetchoffset':517 'd.includependingchanges':519 'd.propertiestofetch':521 'd.relationshipkeypathsforprefetching':524 'data':14,119,215,640,987,1035,1059,1101,1107,1140,1144 'datahandl':685,732 'date':107,110,142,144,214,467,606 'date.now':466 'decim':218 'declar':504 'deep':1124 'default':135,174,844,847,959,1018 'definit':26,29,83 'delet':337,797,981 'deleterul':121,171,1022 'deni':175 'desc':430 'design':1012 'destin':103,139,148,299,699,818 'detailview':780 'dictionari':220 'didmigr':652 'direct':331 'dispatchqueu':984 'dispatchqueue.global':991 'display':1036 'dive':1125 'doubl':212 'dpearson2699':7 'dynam':386,1128 'els':724 'empti':858 'enddat':109,143,152,303,703,822 'enum':223,555,582,614 'environ':782 'ephemer':162 'everi':1005 'explicit':709,937,1071 'express':901 'externalstorag':116,155,1062 'fals':114,132,250,347,852 'favorit':374,381 'fetch':995,1001,1132 'fetchdescriptor':49,50,320,423,431,434,508,512,659,1123 'filter':364,403,486 'firstnam':191 'float':211 'flow':501,912 'fromvers':633,646 'func':686,712,1000 'generat':91,947 'group.com.example.app':253 'groupcontain':251 'guard':717 'handl':333,669 'handler':731,999 'handler.importtrips':737 'handler.process':875,880 'hierarchi':865 'histori':1103 'icloud.com.example.app':256 'id':537 'identifi':252 'imagedata':118 'importtrip':687 'in-memori':276 'inherit':195,1112 'init':136,389,398,577,609 'initi':1013 'int':208 'integr':66,69,763 'invers':123,178,185,975,977,1024 'io':3,16,160,183,188,196,227 'isfavorit':112 'isol':1094 'isselect':130 'isstoredinmemoryon':249,288,804,1079 'larg':1058 'lastnam':192 'let':237,245,257,268,280,294,316,526,531,536,630,643,655,718,730,787,801,806 'level':1030 'lightweight':668 'list':380,417,452 'livingaccommod':127,964,971 'livingaccommodation.self':243,778 'livingaccommodation.trip':124 'localizedstandardcontain':489 'london':819 'main':765 'mainactor':1089,1093 'manag':12 'memori':278 'method':506,1075 'migrat':54,59,266,553,638,1147 'migratev1tov2':628,631 'migratev2tov3':644 'migrationplan':274 'migrationstag':627 'migrationstage.custom':645 'migrationstage.lightweight':632 'miss':854 'mistak':71,74,830 'model':25,28,82,85,96,198,231,342,567,571,594,598,678,758,832,837,868,941,946,1006,1064,1081,1111 'model-definit':27 'modelactor':61,64,681,683,711,894,932,997,1047,1074,1091 'modelconfigur':247,287,803,1078 'modelcontain':30,33,233,240,260,271,283,733,740,775,809,827,855,1025 'modelcontainer-setup':32 'modelcontext':743,783,786,884,993 'modelcontext.delete':338,341,798 'modelcontext.enumerate':542 'modelcontext.fetch':319,529 'modelcontext.fetchcount':534 'modelcontext.fetchidentifiers':539 'modelcontext.insert':307,352,695 'modelcontext.save':310,706,729,936 'modelcontext.transaction':351 'modifi':329 'myapp':767 'name':100,137,146,169,297,412,475,522,575,578,581,602,610,613,697,816 'nest':503 'never':756,942 'new':607 'nil':186,476,495,651 'noaction':176 'non':955 'non-opt':954 'nullifi':173 'object':759,869 'observ':93,948 'observableobject':939,944 'old':168 'oper':36,39,291,1043 'option':154,477,493,956,1066 'optional/defaulted':671 'order':370 'originalnam':167,674 'pari':300,324,462,906,910 'pass':751,757,867 'pattern':1116,1133,1141 'perform':1115 'persist':9,334 'persistentidentifi':715,752,1048 'persistentmodel':92 'persistentmodel.type':569,596 'plan':267 'predic':47,48,321,322,345,365,404,458,460,464,468,473,478,513,900,904,908,915,918,924,1039 'preservevalueondelet':159 'preview':800,817,1076 'previews/tests':279 'privat':255,372,394,444,784 'process':713 'properti':330,608,672,676,1016 'provid':134,846 'publish':945 'queri':10,40,44,356,363,387,393,402,424,442,856,950,1031,1121,1127,1129 'query-in-swiftui':43 'r':692 'r.dest':700 'r.end':704 'r.name':698 'r.start':702 'reactiv':1034 'read':315 'recent':446,453 'recentview':426 'recentview.desc':443 'reconstitut':967 'record':688,694,738 'refer':80,81,839,1095 'references/core-data-coexistence.md':1135,1136 'references/swiftdata-advanced.md':1097,1098 'references/swiftdata-queries.md':1118,1119 'relationship':120,170,229,957,1020 'reli':312 'reliabl':180,979 'remov':675 'renam':165,673 'requir':838 'return':440,725,825,857 'revers':371 'review':75,78,1003 'review-checklist':77 'rome':336 'rule':739 'save':708,930,1072 'scene':772 'scene/root':1028 'schema':51,56,550,619,1053 'schema-versioning-and-migr':55 'schema.version':561,588 'schemamigrationplan':616,1057 'schemav1':556 'schemav1.self':622,634 'schemav2':583 'schemav2.self':623,636,647 'schemav2.trip.self':273 'schemav3.self':649 'search':399,409 'search.isempty':407 'searchview':391 'section':1126 'see':1096,1117,1134 'self':720 'self.destination':147 'self.enddate':151 'self.name':145,580,612 'self.startdate':149 'semant':840 'sendabl':94,742,753 'set':221 'setup':31,34,234 'skill':4,5 'sort':368,410 'sortbi':325,435,514 'sortdescriptor':326,411,436 'source-dpearson2699' 'specifi':177,976,1021 'spotlight':157 'stage':626 'standalon':1138 'start':487 'startdat':106,141,150,301,327,369,437,523,605,701,820 'static':428,558,565,585,592,617,624,629,642 'store':248,1102 'strategi':1148 'string':101,104,138,140,204,213,400,463,576,579,603,611 'struct':90,225,360,390,425,766,779,834 'structur':13 'summer':298 'support':205,483,500,1042 'swift':2,22,95,235,292,359,459,509,554,682,764,872,888,902,916,960,989 'swiftdata':1,8,20,1146 'swiftui':42,46,65,68,358,762,1038,1085 'swiftui-integr':67 'tag':920 'task.detached':890 'ternari':492 'text':384,421,456,794 'throw':690,716,1002 'tovers':635,648 'track':1104 'transact':348 'transform':163,641 'transient':128,842,848,1015 'tri':239,259,270,282,309,318,340,350,528,533,538,541,657,666,705,728,735,808,935 'trip':98,201,295,296,308,317,339,353,375,382,396,397,401,405,418,419,447,454,527,546,573,600,656,661,663,696,719,788,789,799,815,876,877 'trip.destination':335 'trip.displayname':664 'trip.isfavorite':354 'trip.isprocessed':548,726 'trip.name':385,422,457,795 'trip.name.capitalized':665 'trip.name.localizedstandardcontains':408 'trip.persistentmodelid':882 'trip.self':242,262,285,343,570,597,723,777,811 'tripid':714,721,881 'triplistview':361,826 'tripmigrationplan':615 'tripmigrationplan.self':275 'triprecord':689 'true':289,355,367,520,549,727,805,1080 'type':206,497,679 'uint':209 'undo/redo':1113 'unidirect':182 'uniqu':156,187,190,194,1069 'unknown':471 'unsupport':899 'updat':328 'url':216 'use':19,746,835,893,943,949,1032,1040,1046,1049,1060,1065,1077 'uuid':217 'valu':1019 'var':99,102,105,108,111,117,125,129,202,373,376,395,413,429,432,445,448,510,559,566,574,586,593,601,604,618,625,769,785,790,849,962,969 'variant':210,1122 'version':52,57,551 'versionedschema':557,584,1056 'versionedschema.type':621 'versionidentifi':560,587 'via':388,1090 'view':362,379,392,416,427,451,781,793,864,952,1029,1086 'willmigr':650 'windowgroup':773 'without':843,859,958,974 'work':897,988,1045 'wrong':873,886,889,903,917,961,990 'x':850,927","prices":[{"id":"111f2a2a-ac77-4125-84f3-ab41c9fc70f8","listingId":"77785756-87cc-4978-9a16-f0741c724d01","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:33:31.653Z"}],"sources":[{"listingId":"77785756-87cc-4978-9a16-f0741c724d01","source":"github","sourceId":"dpearson2699/swift-ios-skills/swiftdata","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/swiftdata","isPrimary":false,"firstSeenAt":"2026-04-18T22:01:22.681Z","lastSeenAt":"2026-04-22T00:53:45.151Z"},{"listingId":"77785756-87cc-4978-9a16-f0741c724d01","source":"skills_sh","sourceId":"dpearson2699/swift-ios-skills/swiftdata","sourceUrl":"https://skills.sh/dpearson2699/swift-ios-skills/swiftdata","isPrimary":true,"firstSeenAt":"2026-04-18T20:33:31.653Z","lastSeenAt":"2026-04-22T05:40:37.725Z"}],"details":{"listingId":"77785756-87cc-4978-9a16-f0741c724d01","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"swiftdata","source":"skills_sh","category":"swift-ios-skills","skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/swiftdata"},"updatedAt":"2026-04-22T05:40:37.725Z"}}