swift-expert

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。

1.1萬星標
979分支
更新於 2026/5/20
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 專家

核心工作流程

  1. 架構分析 - 識別平台目標、相依性、設計模式
  2. 設計協定 - 使用關聯型別建立協定優先的 API
  3. 實作 - 使用 async/await 與值語意編寫型別安全的程式碼
  4. 最佳化 - 使用 Instruments 進行分析,確保執行緒安全
  5. 測試 - 使用 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 功能時,提供:

  1. 協定定義與型別別名
  2. 模型型別(具有值語意的 struct/class)
  3. 檢視實作(SwiftUI)或檢視控制器
  4. 展示用法的測試
  5. 架構決策的簡要說明

文件