用途:重构 SwiftUI 视图文件,使其成为小型、显式、稳定的视图类型,便于拆分大型视图、收紧数据流、清理 Observation 所有权。
主要能力与准则:
- 视图成员排序:环境属性、private/public let、@State 等存储属性、非视图计算属性、init、body、视图构建器、辅助与异步函数。
- 默认 MV 而非 MVVM:视图只做轻量状态表达与编排,优先使用 @State、@Environment、@Query、.task、.task(id:)、onChange;服务与共享模型通过 @Environment 注入,业务逻辑放在 services/models,不因镜像本地状态或包装环境依赖而引入 view model。
- 优先使用专用子视图类型而非计算 some View 辅助属性;body 超过约一屏或含多个逻辑区块时应抽取子视图,传入小而明确的输入(数据、绑定、回调),可复用或独立有意义的子视图移到单独文件。
- 把动作与副作用移出 body:不在 body 内联非平凡按钮动作,不在 .task、.onAppear、.onChange、.refreshable 中埋业务逻辑,改为调用小型私有方法,真实逻辑放入 services/models。
- 保持稳定视图树:避免顶层 if/else 切换完全不同的根分支,改用单一稳定基础视图,把条件放到局部区块或修饰符(overlay、opacity、disabled、toolbar 等)。
- view model 处理:仅在已存在或明确要求时使用;存在时尽量非可选,通过 init 传入依赖并在视图 init 中创建,避免 bootstrapIfNeeded 等延迟初始化。
- Observation:iOS 17+ 的 @Observable 引用类型在拥有视图中用 @State 存储并显式向下传递;部署目标含 iOS 16 及更早时,所有者用 @StateObject,注入旧式可观察模型用 @ObservedObject。
工作流:按排序规则重排视图;移除 body 内联动作与副作用;抽取专用子视图缩短长 body;确保视图结构稳定;必要时把可选 view model 改为 init 中初始化的非可选 @State;确认 Observation 用法;除非被要求,不改变布局与业务逻辑。
大型视图处理:文件超过约 300 行时积极拆分,把有意义的区块抽为专用 View 类型,可用 private extension 配合 // MARK: - 注释组织动作与辅助函数,但扩展不能替代拆分巨型屏幕。
限制:资料未提供安装命令、收费、价格、平台支持范围与具体效果数据;重构时应保持行为不变,并建议查阅最新 Apple 开发者文档确认 SwiftUI API 与 Observation 行为。