SKILL.md
唯讀
名稱
swift-expert
描述
建構 iOS/macOS/watchOS/tvOS 應用程式,實作 SwiftUI 檢視與狀態管理,設計協定導向架構,處理 async/await 並行,實作 actor 以確保執行緒安全,並除錯 Swift 特定問題。在建構 Swift 5.9+、SwiftUI 或 async/await 並行的 iOS/macOS 應用程式時使用。適用於協定導向程式設計、SwiftUI 狀態管理、actor、伺服器端 Swift、UIKit 整合、Combine 或 Vapor。
Swift 專家
核心工作流程
- 架構分析 - 識別平台目標、相依性、設計模式
- 設計協定 - 使用關聯型別建立協定優先的 API
- 實作 - 使用 async/await 與值語意編寫型別安全的程式碼
- 最佳化 - 使用 Instruments 進行分析,確保執行緒安全
- 測試 - 使用 XCTest 與非同步模式編寫全面測試
驗證檢查點: 步驟 3 後,執行
swift build確認編譯成功。步驟 4 後,執行swift build -warnings-as-errors以顯示 actor 隔離與 Sendable 警告。步驟 5 後,執行swift test並確認所有非同步測試通過。
參考指南
根據上下文載入詳細指引:
| 主題 | 參考文件 | 載入時機 |
|---|---|---|
| SwiftUI | references/swiftui-patterns.md |
建構檢視、狀態管理、修飾詞 |
| 並行 | references/async-concurrency.md |
async/await、actor、結構化並行 |
| 協定 | references/protocol-oriented.md |
協定設計、泛型、型別抹消 |
| 記憶體 | references/memory-performance.md |
ARC、weak/unowned、效能最佳化 |
| 測試 | references/testing-patterns.md |
XCTest、非同步測試、模擬策略 |
程式碼模式
async/await — 正確 vs. 錯誤
// ✅ 正確做法:使用 async/await 搭配結構化錯誤處理
func fetchUser(id: String) async throws -> User {
let url = URL(string: "https://api.example.com/users/\(id)")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode(User.self, from: data)
}
// ❌ 錯誤做法:在非同步環境中混用 completion handler
func fetchUser(id: String) async throws -> User {
return try await withCheckedThrowingContinuation { continuation in
// 避免在已有原生非同步版本時,用此方式包裝現有非同步 API
legacyFetch(id: id) { result in
continuation.resume(with: result)
}
}
}
SwiftUI 狀態管理
// ✅ 正確做法:使用 @Observable(Swift 5.9+)作為檢視模型
@Observable
final class CounterViewModel {
var count = 0
func increment() { count += 1 }
}
struct CounterView: View {
@State private var vm = CounterViewModel()
var body: some View {
VStack {
Text("\(vm.count)")
Button("Increment", action: vm.increment)
}
}
}
// ❌ 錯誤做法:在 @Observable 已足夠時使用 ObservableObject/Published
class LegacyViewModel: ObservableObject {
@Published var count = 0 // Swift 5.9+ 中不必要的樣板程式碼
}
協定導向架構
// ✅ 正確做法:使用關聯型別定義能力協定
protocol Repository<Entity> {
associatedtype Entity: Identifiable
func fetch(id: Entity.ID) async throws -> Entity
func save(_ entity: Entity) async throws
}
struct UserRepository: Repository {
typealias Entity = User
func fetch(id: UUID) async throws -> User { /* … */ }
func save(_ user: User) async throws { /* … */ }
}
// ❌ 錯誤做法:在協定更合適時使用類別作為基底型別
class BaseRepository { // 避免使用類別繼承來共享行為
func fetch(id: UUID) async throws -> Any { fatalError("需要覆寫") }
}
Actor 確保執行緒安全
// ✅ 正確做法:將可變共享狀態隔離在 actor 中
actor ImageCache {
private var cache: [URL: UIImage] = [:]
func image(for url: URL) -> UIImage? { cache[url] }
func store(_ image: UIImage, for url: URL) { cache[url] = image }
}
// ❌ 錯誤做法:使用類別搭配手動鎖定
class UnsafeImageCache {
private var cache: [URL: UIImage] = [:]
private let lock = NSLock() // 容易出錯;建議使用 actor 隔離
func image(for url: URL) -> UIImage? {
lock.lock(); defer { lock.unlock() }
return cache[url]
}
}
限制
必須遵守
- 適當使用型別提示與推斷
- 遵循 Swift API 設計指南
- 使用
async/await處理非同步操作(參見上方模式) - 確保符合
Sendable以支援並行 - 預設使用值型別(
struct/enum) - 使用標記註解(
/// …)記錄 API - 使用屬性包裝器處理橫切關注點
- 在最佳化前使用 Instruments 進行分析
禁止事項
- 無正當理由使用強制解包(
!) - 在閉包中造成保留循環
- 不當混合同步與非同步程式碼
- 忽略 actor 隔離警告
- 不必要地使用隱式解包可選值
- 跳過錯誤處理
- 在有 Swift 替代方案時使用 Objective-C 模式
- 硬編碼平台特定值
輸出範本
實作 Swift 功能時,提供:
- 協定定義與型別別名
- 模型型別(具有值語意的 struct/class)
- 檢視實作(SwiftUI)或檢視控制器
- 展示用法的測試
- 架構決策的簡要說明




