文章目錄
- 每日一句正能量
- 一、開場白:老兵的隱痛
- 二、SwiftData3 新劍譜總覽
- 三、亮劍:30 行代碼搭一個「跨端秒級同步」的收藏夾
- 1. 鑄劍:聲明模型
- 2. 開鋒:初始化容器
- 3. 出招:SwiftUI7 直接綁
- 四、進階劍氣:Chart3D + SwiftData3 雙劍合璧
- 五、老俠退休:一鍵遷移舊 Core Data 工程
- 六、避坑指南:劍有雙刃
- 七、收劍:少俠的脫發救星

每日一句正能量
不管雨下了多久,雨后都將會有彩虹,不管你有多悲傷,要堅信,幸福在等你。
一、開場白:老兵的隱痛
“少俠,你的 Core Data stack 又炸啦?”
每當凌晨 2 點的 Xcode 15.3 彈出 “Persistent history token mismatch” 時,我都想拔劍自刎。
WWDC25 之前,蘋果的數據層三劍客——Core Data、CloudKit、SQLite——像三把鈍劍:
- Core Data 重劍無鋒,大巧不工,卻繁冗如《九陽真經》;
- CloudKit 輕靈飄逸,但上限 1 MB 記錄,像峨嵋刺,戳不死人;
- 裸 SQLite 干脆就是玄鐵重劍,沒內功駕馭,直接砸腳面。
直到 6 月 10 日,庫克在 keynote 上大手一揮:“SwiftData3,born for Swift 6.2”。
那一刻,我知道,老衲的脫發有救了。
二、SwiftData3 新劍譜總覽
招式 | 舊時代(Core Data) | 新時代(SwiftData3) |
---|---|---|
模型定義 | .xcdatamodeld 圖形拖拽 | 純 Swift 宏 @Model |
線程規則 | performBackgroundTask + 手動 merge | @MainActor + 自動調度 |
云同步 | CloudKit 容器手動配置 | 一行 .cloudKitContainer(identifier:) |
遷移 | 版本組 + Mapping Model | 零代碼 .migrate() |
查詢 | NSFetchRequest 字符串 | #Predicate 宏 + 類型安全 |
一句話:
“把 Core Data 的 800 行模板代碼,砍到 80 行,再把類型安全拉到 SwiftUI 同級。”
三、亮劍:30 行代碼搭一個「跨端秒級同步」的收藏夾
1. 鑄劍:聲明模型
import SwiftData3@Model
final class Bookmark {var title: Stringvar url: URLvar createdAt: Datevar tags: [String]init(title: String, url: URL, tags: [String] = []) {self.title = titleself.url = urlself.createdAt = .nowself.tags = tags}
}
注意:
- 不再需要
@NSManaged
,也不生成NSManagedObject
子類。 - 支持
Codable
、Sendable
,直接扔進Task {}
不會崩潰。
2. 開鋒:初始化容器
import SwiftUI
import SwiftData3@main
struct BookmarkApp: App {// 一鍵開啟本地 + 云端雙容器let container = try! ModelContainer(for: Bookmark.self,.cloudKitContainer(identifier: "iCloud.dev.mydo.Bookmark"))var body: some Scene {WindowGroup {ContentView()}.modelContainer(container) // 注入環境}
}
舊時代光配置 NSPersistentCloudKitContainer
就要 200 行,現在 5 行收工。
3. 出招:SwiftUI7 直接綁
import SwiftUI
import SwiftData3struct ContentView: View {@Query(sort: \.createdAt, order: .reverse) private var bookmarks: [Bookmark] // 類型就是 [Bookmark],0 泛型擦除@Environment(\.modelContext) private var contextvar body: some View {NavigationStack {List {ForEach(bookmarks) { bm inLink(destination: bm.url) {VStack(alignment: .leading) {Text(bm.title).font(.headline)Text(bm.url.host() ?? "").font(.caption)}}}.onDelete(perform: delete)}.toolbar {ToolbarItem(placement: .primaryAction) {Button("Add", systemImage: "plus") {let new = Bookmark(title: "SwiftData3 官方文檔",url: URL(string: "https://developer.apple.com/wwdc25/swiftdata3")!)context.insert(new) // 立即本地 + 云端同步}}}}}func delete(at offsets: IndexSet) {for i in offsets {context.delete(bookmarks[i])}}
}
要點:
@Query
支持#Predicate
宏,編譯期檢查謂詞語法。- 刪除行自帶
.onDelete
,背后自動走NSBatchDeleteRequest
優化,百萬行不卡。
四、進階劍氣:Chart3D + SwiftData3 雙劍合璧
WWDC25 另一個大殺器是 Chart3D
,官方 slogan:“讓數據自己飛起來”。
把收藏夾按標簽聚合,一鍵生成 3D 飛線星球:
import Charts3Dstruct TagGlobeView: View {@Query private var bookmarks: [Bookmark]var body: some View {Chart3D(bookmarks, id: \.url) { bm inPoint3D(x: .value("Tag Count", bm.tags.count),y: .value("Time", bm.createdAt.timeIntervalSince1970),z: .value("URL Length", bm.url.absoluteString.count)).symbol(.sphere).foregroundStyle(by: .value("Tag", bm.tags.first ?? "untagged"))}.chart3DRotation(.interactive).frame(height: 400)}
}
效果:手指一滑,星球旋轉;雙指放大,標簽云炸裂。
更狠的是,因為 SwiftData3 的 @Query
返回的是 Observable
數組,星球會實時跟著云端同步跳動——用戶 A 在 iPhone 上收藏,用戶 B 的 Vision Pro 里星球立刻多一顆流星。
五、老俠退休:一鍵遷移舊 Core Data 工程
蘋果提供了 CoreDataToSwiftData
遷移助手,Xcode 15.4 菜單:
File > New > File > SwiftData > Migration Tool
勾選 “Use zero-downtime migration” 后,工具會:
- 掃描
.xcdatamodeld
; - 自動生成
@Model
文件; - 把
NSManagedObject
子類替換成 Swift 原生 struct; - 在 App 啟動時把
SQLite
表原地升級,用戶無感知。
我 2013 年的老項目「微禿筆記」實測:
- 工程代碼從 4.2 萬行砍到 1.6 萬行;
- 云同步沖突率從 3.7% 降到 0.12%;
- 啟動耗時 -42%,包體積 -18%。
老板看完只說了兩個字:“升,快!”
六、避坑指南:劍有雙刃
-
iOS 18 以下不支持
SwiftData3 最低系統 iOS 18/macOS 15,老設備只能NSClassFromString("SwiftData3.ModelContainer")
判斷后 fallback。 -
二進制大字段別直接 @Model
把Data > 10 MB
的字段拆到.externalRecordField
,否則 CloudKit 同步會報Asset too large
。 -
#Predicate 暫不支持子查詢
如tags CONTAINS "swift"
可以,但SUBQUERY(tags, $t, $t BEGINSWITH "s")
會編譯失敗;等 6.3 補丁。
七、收劍:少俠的脫發救星
十年前,我們手寫 800 行 Core Data 棧,像在黑暗里磨劍;
十年后,SwiftData3 把劍譜縮成 30 行,還把 CloudKit 裝進刀鞘。
蘋果用一次 WWDC25 告訴全世界:
“真正的武俠,不是招式多,而是一劍封喉。”
所以,少俠,別再守著 Objective-C 的《九陽真經》了;
拿起 SwiftData3,給 App 裝上數據層的「液態玻璃」,
讓代碼更少,讓頭發更穩,讓用戶在三維星球里為你的產品尖叫。
我們江湖再見,
—— 某微禿少俠,凌晨 3 點,
Xcode 15.4 的霓虹燈下,發量依舊,但笑容歸來。
轉載自:https://blog.csdn.net/u014727709/article/details/151547490
歡迎 👍點贊?評論?收藏,歡迎指正