mcpField
S
swiftui-patterns

swiftui-patterns

github.com/johnrogers开发233260 次安装41 周前更新
代码仓库

关于 swiftui-patterns

swiftui-patterns 是面向 iOS 17 及更新版本 SwiftUI 开发者的参考技能,介绍状态、环境、导航和异步任务的现代 Apple API 用法,并提示常见问题。

主要功能

  1. 01iOS 17+ 状态与环境模式
  2. 02使用 .task 处理异步工作
  3. 03NavigationStack 与 NavigationPath 指南
  4. 04无障碍与 UIKit 互操作建议

适用场景

  1. 01为 SwiftUI 模型选择状态包装器
  2. 02将 iOS 16 模式迁移到 iOS 17+
  3. 03实现异步加载与导航
  4. 04检查无障碍支持或 UIKit 封装

安装

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

$npx skills add https://github.com/johnrogers/claude-swift-engineering --skill swiftui-patterns

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

包含的文件

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

references/
accessibility.md
async-patterns.md
composition.md
environment.md
migration-guide.md
mvvm-observable.md
navigation.md
observable.md
performance.md
state-management.md
uikit-interop.md
view-modifiers.md

详细介绍

SwiftUI 模式(iOS 17+)

SwiftUI 17+ 通过 @Observable 去除了 ObservableObject 样板代码,使用 @Environment 简化了环境注入,并引入了基于任务的异步模式。核心原则:使用 Apple 的现代 API,而非响应式库。

概览

快速参考

需求使用(iOS 17+)不要使用
可观察模型@ObservableObservableObject
已发布属性普通属性@Published
自有状态@State@StateObject
传入的模型(绑定)@Bindable@ObservedObject
环境注入environment(_:)environmentObject(_:)
访问环境@Environment(Type.self)@EnvironmentObject
显示时执行异步操作.task { }.onAppear { Task {} }
值变化onChange(of:initial:_:)onChange(of:perform:)

核心工作流

  1. 使用 @Observable 定义模型类(无需 @Published)
  2. 使用 @State 保存视图拥有的模型,使用 @Bindable 接收传入的模型
  3. 使用 .task { } 执行异步工作(视图消失时自动取消)
  4. 使用 NavigationStack 搭配 NavigationPath 实现编程式导航
  5. 为可交互元素应用 .accessibilityLabel() 和 .accessibilityHint()

参考资料加载指南

只要有一丝可能需要这些内容,就务必加载参考文件。 有上下文总比遗漏模式或犯错要好。

参考资料何时加载
Observable创建新的 @Observable 模型类时
State Management在 @State、@Bindable 和 @Environment 之间选择时
Environment向视图层级注入依赖项时
View Modifiers使用 onChange、task 或 iOS 17+ 修饰符时
Migration Guide将 iOS 16 代码更新到 iOS 17+ 时
MVVM Observable搭建视图模型架构时
Navigation实现编程式导航或深层链接导航时
Performance列表包含 100+ 项或发生过多重新渲染时
UIKit Interop封装 UIKit 组件(WKWebView、PHPicker)时
Accessibility使用 VoiceOver、Dynamic Type 或辅助功能操作时
Async Patterns处理加载状态、刷新或后台任务时
Composition创建可复用视图修饰符或复杂的条件式 UI 时

常见错误

  1. 对传入的模型过度使用 @Bindable — 为每个属性都创建 @Bindable 会导致不必要的视图重新加载。仅对需要双向绑定的可变模型属性使用 @Bindable。只读计算属性应使用普通属性。

  2. 状态放置错误 — 将模型状态放在视图中,而不是专用的 @Observable 模型中,会导致视图逻辑变得混乱。务必将模型和视图职责分开。

  3. NavigationPath 状态损坏 — 错误地修改 NavigationPath 可能使其处于不一致状态。使用 navigationDestination(for:destination:) 并妥善管理状态,以避免路径损坏。

  4. 未处理 .task 取消 — .task 会在视图消失时自动处理取消,但嵌套的 Task 不会。复杂的异步流程需要显式跟踪取消,以避免残留任务。

  5. 忽略环境失效 — 在父视图中更改环境值不会自动使子视图失效。请始终一致地使用 @Environment,并了解观察机制会在何时触发重新渲染。

  6. UIKit 互操作导致内存泄漏 — 如果未打破委托引用循环,UIViewRepresentable 和 UIViewControllerRepresentable 可能导致内存泄漏。必须使用弱引用并进行显式清理。

评论

支持 Markdown