关于 solid-swift
solid-swift 是面向 Swift 6 和 SwiftUI 项目的代码组织与实现指导技能。它通过按功能划分的目录结构、并发约定和代码模板落实 SOLID 与 DRY 实践。
主要功能
- 01按功能划分的模块目录结构
- 02单一职责文件与协议分离
- 03使用 @Observable 的 ViewModel 和 Sendable 模型
- 04每个 View 必须包含 #Preview
- 05提供 SOLID、并发与反模式参考
适用场景
- 01按功能组织 SwiftUI 项目
- 02检查代码是否遵循 SOLID 和 DRY
- 03一致地创建 ViewModel、服务和模型
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ fusengine/ claude-plugins --skill solid-swift安装后在 Claude Code 中输入/solid-swift确认已加载。
详细介绍
为 Swift 6 和 SwiftUI(iOS 27+)项目强制执行 SOLID 和 DRY 原则:必须采用 Features/[Feature]/ 模块化目录结构(绝不使用扁平的 Sources/ 布局);每个文件只负责一项职责,唯一的行数限制是钩子上限(`FUSE_SOLID_MAX_LINES`);协议必须放在独立的 Protocols/ 目录中;ViewModel 使用 @Observable + @MainActor;模型使用 Sendable 结构体;每个 View 都必须包含 #Preview。
涵盖全部五项 SOLID 原则,并提供专门的参考文档(SRP、OCP、LSP、ISP、DIP)、并发模式(actor、@MainActor、Sendable)、反模式目录,以及 View、ViewModel、服务、协议和模型的代码模板。
要求在编写新代码前先搜索代码库,查找可复用的协议和服务;在复制用于 2 个或更多功能的逻辑前,检查共享位置(Core/Extensions/、Core/Utilities/、Core/Protocols/)。
SOLID Swift - Apple 2026 年最佳实践
Agent 工作流(强制)
在进行任何实现之前,必须并行启动 3 个 Agent,每个分别调用一次 Agent,并提供一个 name:
- fuse-ai-pilot:explore-codebase - 分析现有架构
- fuse-ai-pilot:research-expert - 通过 Apple Docs MCP + Context7 核实 Swift/Apple 文档
- XcodeBuildMCP - 代码更改后进行构建验证。随后运行 fuse-ai-pilot:sniper。
DRY - 创建前先复用(强制)
编写任何新代码前:
- 搜索代码库,查找类似的协议、服务或逻辑
- 检查共享位置:
Core/Extensions/、Core/Utilities/、Core/Protocols/ - 如果存在类似代码 -> 扩展或复用,而不是重复实现
- 如果代码将用于 2 个或更多功能 -> 直接在
Core/中创建
架构(必须采用功能模块化结构)
| 层 | 位置 |
|---|---|
| 视图 | Features/[Feature]/Views/ |
| ViewModel | Features/[Feature]/ViewModels/ |
| 服务 | Features/[Feature]/Services/ |
| 协议 | Features/[Feature]/Protocols/ |
| 共享代码 | Core/{Models,Protocols,Services,Extensions,Utilities}/ |
文件大小:唯一的行数限制是钩子上限(FUSE_SOLID_MAX_LINES);应在达到上限前充分拆分职责。如果合理的修复无法在限制内完成,请报告问题,绝不要绕过钩子。
绝不使用扁平的 Sources/ 结构——始终使用 Features/[Feature]/
关键规则(强制)
| 规则 | 要求 |
|---|---|
| 文件限制 | 仅受钩子上限 FUSE_SOLID_MAX_LINES 限制;每个文件只负责一项职责 |
| ViewModel | @MainActor @Observable |
| 协议 | 只能放在 Features/[Feature]/Protocols/ 或 Core/Protocols/ 中 |
| 模型 | Sendable 结构体 |
| 文档 | 所有公共 API 都要添加 /// 文档注释 |
| 预览 | 每个 View 都必须包含 #Preview |
参考指南
概念
| 主题 | 参考文档 | 适用场景 |
|---|---|---|
| SOLID 概览 | solid-principles.md | 快速了解所有原则 |
| SRP | single-responsibility.md | 处理臃肿的视图/ViewModel、拆分文件 |
| OCP | open-closed.md | 添加提供方、提高可扩展性 |
| LSP | liskov-substitution.md | 协议约定、测试 |
| ISP | interface-segregation.md | 臃肿的协议、拆分协议 |
| DIP | dependency-inversion.md | 注入、测试、模拟 |
| 并发 | concurrency-patterns.md | actor、@MainActor、Sendable |
| 反模式 | anti-patterns.md | 检测代码异味 |
模板
| 模板 | 适用场景 |
|---|---|
| view.md | 包含子视图和 #Preview 的 SwiftUI View |
| viewmodel.md | 使用 @MainActor 的 @Observable ViewModel |
| service.md | API Service、Mock、Cache actor |
| protocol.md | Service protocol、CQRS、Auth |
| model.md | Model、DTO、Error、Enum |
禁止事项
| 反模式 | 修复方法 |
|---|---|
| 文件承担多项职责,或被钩子限制所阻止 | 按职责拆分 |
| 在实现文件中定义 Protocol | 移至 Protocols/ 目录 |
ObservableObject | 使用 @Observable |
| 完成处理器 | 使用 async/await |
缺少 #Preview | 为每个 View 添加预览 |
| 在异步代码中使用非 Sendable 类型 | 使用带有 let 的 struct |
Sources/ 结构扁平 | 使用 Features/[Feature]/ |
评论
支持 Markdown