mcpField
S
swift-expert

swift-expert

github.com/farmage开发224273 次安装5 周前更新
代码仓库

关于 swift-expert

swift-expert 是面向 Swift 开发的技能,覆盖架构设计、并发、性能优化和测试。它强调协议优先、类型安全及通过构建与测试命令验证实现。

主要功能

  1. 01架构与平台分析
  2. 02协议优先的 API 设计
  3. 03async/await 与并发指导
  4. 04Instruments 性能分析
  5. 05XCTest 测试指导

适用场景

  1. 01设计 Swift 模块与协议 API
  2. 02实现异步操作和线程安全状态
  3. 03排查性能与并发问题
  4. 04编写并运行 XCTest 测试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/farmage/opencode-skills --skill swift-expert

安装后在 Claude Code 中输入/swift-expert确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
async-concurrency.md
memory-performance.md
protocol-oriented.md
swiftui-patterns.md
testing-patterns.md

详细介绍

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,并确认所有异步测试均通过。

参考指南

根据上下文加载详细指导:

主题参考资料加载时机
SwiftUIreferences/swiftui-patterns.md构建视图、管理状态、使用修饰符时
并发references/async-concurrency.md使用 async/await、actors、结构化并发时
协议references/protocol-oriented.md设计协议、泛型和类型擦除时
内存references/memory-performance.md使用 ARC、weak/unowned、优化性能时
测试references/testing-patterns.md使用 XCTest、编写异步测试、设计模拟策略时

代码模式

async/await — 正确与错误示例
// ✅ DO: async/await with structured error handling
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)
}

// ❌ DON'T: mixing completion handlers with async context
func fetchUser(id: String) async throws -> User {
    return try await withCheckedThrowingContinuation { continuation in
        // Avoid wrapping existing async APIs this way when a native async version exists
        legacyFetch(id: id) { result in
            continuation.resume(with: result)
        }
    }
}
SwiftUI 状态管理
// ✅ DO: use @Observable (Swift 5.9+) for view models
@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)
        }
    }
}

// ❌ DON'T: reach for ObservableObject/Published when @Observable suffices
class LegacyViewModel: ObservableObject {
    @Published var count = 0  // Unnecessary boilerplate in Swift 5.9+
}
面向协议的架构
// ✅ DO: define capability protocols with associated types
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 { /* … */ }
}

// ❌ DON'T: use classes as base types when a protocol fits
class BaseRepository {  // Avoid class inheritance for shared behavior
    func fetch(id: UUID) async throws -> Any { fatalError("Override required") }
}
用于线程安全的 Actor
// ✅ DO: isolate mutable shared state in an 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 }
}

// ❌ DON'T: use a class with manual locking
class UnsafeImageCache {
    private var cache: [URL: UIImage] = [:]
    private let lock = NSLock()  // Error-prone; prefer actor isolation
    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. 模型类型(具有值语义的结构体/类)
  3. 视图实现(SwiftUI)或视图控制器
  4. 展示用法的测试
  5. 对架构决策的简要说明

文档

评论

支持 Markdown