swiftui-expert-skill
编写、评审或优化 SwiftUI 代码时,遵循以下最佳实践:采用声明式状态管理,合理拆分可复用视图组件,优化渲染性能与内存效率,全面应用 SwiftUI 现代 API(如 `Observable` 宏与 `View` 协议扩展),结合 Swift 结构化并发处理异步任务,并为 iOS 26+ 适配 Liquid Glass 设计系统的动态玻璃材质与景深效果。适用于新功能开发、现有视图重构、代码质量评审及现代化 SwiftUI 模式迁移场景。
作者
分类
开发工具安装
下载并解压到你的 skills 目录
复制命令,发送给 OpenClaw 自动安装:
SwiftUI Expert - SwiftUI 代码审查与最佳实践指南
技能概述
SwiftUI Expert 是一个专业的 SwiftUI 代码助手,帮助开发者编写、审查和改进 SwiftUI 代码,涵盖状态管理、视图组合、性能优化、现代 API 迁移、Swift 并发编程以及 iOS 26+ Liquid Glass 样式实现。
适用场景
1. 构建 SwiftUI 新功能
在开发新的 SwiftUI 功能时,该技能能够指导您选择正确的状态管理方案(如 @Observable vs ObservableObject),使用现代 SwiftUI API(如 NavigationStack、Tab API),并采用最佳视图组合模式,确保代码从设计之初就符合 Apple 的最佳实践。
2. 重构现有 SwiftUI 代码
面对遗留的 SwiftUI 代码,该技能可以系统性地审查代码质量,识别已弃用的 API(如 foregroundColor、NavigationView),推荐现代替代方案,提取复杂视图以提高可维护性,并优化性能瓶颈(如减少不必要的状态更新、使用稳定的 ForEach 身份)。
3. SwiftUI 代码审查与团队协作
为团队提供标准化的 SwiftUI 代码审查清单,涵盖状态管理、现代 API 使用、视图结构、性能优化、列表模式、布局最佳实践以及 iOS 26+ 特性等多个维度,帮助团队保持一致的代码质量和编码规范。
核心功能
1. 智能状态管理指导
该技能提供详细的属性包装器选择指南,优先推荐使用现代的 @Observable 宏而非传统的 ObservableObject,明确区分 @State、@Binding、@Bindable 的使用场景,并强调 @MainActor 线程安全注解的重要性,帮助您避免常见的状态管理陷阱。
2. 现代 API 迁移助手
系统性地识别并替换已弃用的 SwiftUI API,包括使用 foregroundStyle() 替代 foregroundColor(),使用 NavigationStack 替代 NavigationView,使用 Tab API 替代 tabItem(),以及采用新的 onChange() 语法和 containerRelativeFrame() 布局方式,确保代码始终使用最新的 API。
3. 性能优化专家
深入分析 SwiftUI 视图性能问题,提供从视图组合、状态传递、ForEach 稳定性到布局计算的全链路优化建议,包括使用 LazyVStack/LazyHStack 处理长列表、避免 body 中的副作用、减少不必要的状态更新、使用 POD 视图加速 diff 等专业技巧。
常见问题
什么时候应该用 @Observable 而不是 ObservableObject?
对于新代码,应该始终优先使用 @Observable 宏而不是 ObservableObject 协议。@Observable 是 iOS 17+ 引入的现代状态管理方案,性能更好、语法更简洁,且能更好地处理嵌套对象。使用 @Observable 时,应该配合 @State(而非 @StateObject)来持有对象实例,并在需要时用 @MainActor 标记以确保线程安全。只有当项目需要支持 iOS 17 之前的版本时,才考虑使用传统的 ObservableObject。
SwiftUI ForEach 为什么不推荐使用 .indices?
使用 .indices 作为 ForEach 的身份会导致不稳定的行为,因为当数组元素发生变化时,索引可能会改变,造成 SwiftUI 无法正确追踪视图身份,引发动画异常或状态丢失。推荐的做法是为数据模型添加遵循 Identifiable 协议的 id 属性,或使用 \.id 作为身份参数。这样可以确保 SwiftUI 在数据变化时正确地更新、移动或删除对应的视图。
SwiftUI 视图性能差怎么排查和优化?
首先使用 Self._printChanges() 调试方法来识别视图意外更新的原因。常见的性能问题包括:在 body 中执行耗时计算、传递过大的配置对象、使用不稳定的 ForEach 身份、过度使用 AnyView、以及在热路径中进行冗余的状态更新。优化策略包括:提取子视图减少更新范围、使用 LazyVStack/LazyHStack 处理长列表、预过滤数据避免 ForEach 内联过滤、使用 POD 视图加速 diff,以及在滚动回调等热路径中加入值变化检查。
SwiftUI 如何选择正确的属性包装器?
选择属性包装器的核心原则是理解数据的所有权和流向。@State 用于视图拥有的内部状态(必须声明为 private);@Binding 用于子视图需要修改父视图状态时;@Bindable 用于注入的 @Observable 对象需要双向绑定;简单的只读值直接用 let 传递;需要响应式监听的只读值用 var 配合 .onChange()。特别注意:传递下来的值绝不能声明为 @State 或 @StateObject,因为它们只接受初始值。
NavigationStack 和 NavigationView 有什么区别?
NavigationStack 是 iOS 16+ 引入的现代导航 API,替代了已弃用的 NavigationView。主要优势包括:支持类型安全的 navigationDestination(for:) 导航、更简洁的 API 设计、更好的性能、以及对导航堆栈的编程式控制。新项目应该始终使用 NavigationStack,只有需要支持 iOS 16 之前的版本时才考虑 NavigationView。
SwiftUI 代码审查时应该重点检查哪些内容?
代码审查应覆盖多个维度:状态管理是否使用 @Observable 而非 ObservableObject、属性包装器选择是否正确、是否使用已弃用 API(如 foregroundColor、cornerRadius)、视图是否过复杂需要拆分、ForEach 是否使用稳定身份、是否存在性能隐患(如 body 中的副作用)、@State/@StateObject 是否声明为 private、以及是否正确处理了 iOS 版本兼容性。该技能提供完整的审查清单,涵盖状态管理、现代 API、表单与导航、滚动视图、文本格式化、视图结构、性能、列表模式和布局等多个方面。