SKILL.md
readonlyread-only
name
swiftdata-pro
description
撰寫、審查並改善 SwiftData 程式碼,使用現代 API 與最佳實務。適用於閱讀、撰寫或審查使用 SwiftData 的專案。
撰寫與審查 SwiftData 程式碼,確保正確性、現代 API 使用方式,並遵循專案慣例。僅回報真正的問題——不要吹毛求疵或憑空捏造問題。
審查流程:
- 使用
references/core-rules.md檢查核心 SwiftData 問題。 - 使用
references/predicates.md檢查謂詞是否安全且受支援。 - 若專案使用 CloudKit,使用
references/cloudkit.md檢查 CloudKit 特定限制。 - 若專案目標為 iOS 18+,使用
references/indexing.md檢查索引機會。 - 若專案目標為 iOS 26+,使用
references/class-inheritance.md檢查類別繼承模式。
若進行部分工作,僅載入相關的參考檔案。
核心指示
- 目標為 Swift 6.2 或更新版本,使用現代 Swift 並行處理。
- 使用者強烈偏好全面使用 SwiftData。除非是 SwiftData 無法解決的功能,否則不要建議使用 Core Data 功能。
- 未經詢問,不要引入第三方框架。
- 使用一致的專案結構,資料夾配置依應用功能決定。
輸出格式
若使用者要求審查,請按檔案組織發現的問題。針對每個問題:
- 指出檔案與相關行號。
- 說明違反的規則名稱。
- 顯示簡短的修正前/後程式碼範例。
跳過沒有問題的檔案。最後以優先順序摘要列出最應優先進行的影響最大的變更。
若使用者要求撰寫或改善程式碼,請遵循相同規則,但直接進行修改,而非回傳發現報告。
輸出範例:
Destination.swift
第 8 行:為關聯新增明確的刪除規則。
// 修正前
var sights: [Sight]
// 修正後
@Relationship(deleteRule: .cascade, inverse: \Sight.destination) var sights: [Sight]
第 22 行:不要在謂詞中使用 isEmpty == false——它會在執行時崩潰。請改用 !。
// 修正前
#Predicate<Destination> { $0.sights.isEmpty == false }
// 修正後
#Predicate<Destination> { !$0.sights.isEmpty }
DestinationListView.swift
第 5 行:@Query 僅能在 SwiftUI 檢視內部使用。
// 修正前
class DestinationStore {
@Query var destinations: [Destination]
}
// 修正後
class DestinationStore {
var modelContext: ModelContext
func fetchDestinations() throws -> [Destination] {
try modelContext.fetch(FetchDescriptor<Destination>())
}
}
摘要
- 資料遺失(高): Destination.swift 第 8 行缺少刪除規則,導致刪除目的地時 sights 會變成孤兒資料。
- 崩潰(高): 第 22 行的
isEmpty == false會在執行時崩潰——請改用!isEmpty。 - 行為不正確(高): DestinationListView.swift 第 5 行的
@Query僅能在 SwiftUI 檢視內部運作。
範例結束。
參考資料
references/core-rules.md- 自動儲存、關聯、刪除規則、屬性限制與 FetchDescriptor 最佳化。references/predicates.md- 支援的謂詞操作、會在執行時崩潰的危險模式,以及不支援的方法。references/cloudkit.md- CloudKit 特定限制,包括唯一性、可選性與最終一致性。references/indexing.md- iOS 18+ 的資料庫索引,包括單一與複合屬性索引。references/class-inheritance.md- iOS 26+ 的模型子類別化,包括 @available 需求、schema 設定與謂詞過濾。






