SuperAPI AI 工具集

swiftui-view-refactor

编程与开发

查看项目

更新于 10-16 03:51

技能介绍

SwiftUI View Refactor 是一个面向 SwiftUI 代码重构的技能,主要用途是把大型、复杂的 SwiftUI 视图整理为更小、显式且稳定的视图类型,让数据流更清晰、视图更易维护。

主要能力与核心准则如下:

一、视图属性排序。除非现有文件有更强的本地约定需要保留,否则要求按从上到下的顺序排列:环境属性(private/public let)、@State 及其他存储属性、非视图的 computed var、init、body、视图构建器及其他视图辅助、辅助函数与异步函数。

二、默认使用 MV 而非 MVVM。视图应是轻量的状态表达与编排点,而不是业务逻辑的容器。优先使用 @State、@Environment、@Query、.task、.task(id:) 和 onChange,再考虑 view model;通过 @Environment 注入服务与共享模型;不要把领域逻辑放进 body。不要仅仅为了镜像本地视图状态或包装环境依赖而引入 view model。如果界面变大,应先把 UI 拆分为子视图,而不是发明新的 view model 层。

三、优先使用专用子视图类型而非 computed some View 辅助。若 body 超过大约一屏或包含多个逻辑区块,应标记出来;对于有状态、异步工作、分支逻辑或值得单独预览的非平凡区块,优先抽取为专用 View 类型。computed some View 辅助应保持稀少且小,不要用大量 private var header: some View 之类的片段拼出整个界面。向抽取出的子视图传入小而显式的输入(数据、绑定、回调),而不是整个父状态。若抽取的子视图变得可复用或可独立表达,应移动到单独文件。技能给出了推荐写法和应避免的写法示例。

四、把动作与副作用从 body 中抽出。不要把非平凡的按钮动作内联在 body 中,也不要把业务逻辑埋在 .task、.onAppear、.onChange 或 .refreshable 中。优先从视图调用小的私有方法,把真正的业务逻辑移到服务或模型中,使 body 读起来像 UI,而不是像 view controller。技能提供了 save、reload 等示例。

五、保持稳定的视图树,避免顶层条件视图切换。避免 body 或 computed 视图通过 if/else 返回完全不同的根分支。优先使用单一稳定基础视图,把条件放在区块或修饰符内部(overlay、opacity、disabled、toolbar 等)。根级分支切换会造成 identity 变动、更广泛的失效和额外重算。

六、view model 处理(仅当已存在或明确要求时)。把 view model 视为遗留或明确需要的模式,而非默认方案。除非请求或现有代码明确需要,不要引入 view model。若已存在 view model,尽量使其非可选;通过 init 向视图传递依赖,再在视图 init 中创建 view model;避免 bootstrapIfNeeded 之类的延迟初始化变通做法。技能给出了基于 Observation 的示例。

七、Observation 用法。对于 iOS 17+ 上的 @Observable 引用类型,在拥有它的视图中以 @State 存储;显式向下传递可观察对象,除非 UI 确实需要,避免可选状态。若部署目标包含 iOS 16 或更早,在拥有者处使用 @StateObject,注入遗留可观察模型时使用 @ObservedObject。

工作流程:按排序规则重排视图;从 body 移除内联动作与副作用,把业务逻辑移入服务或模型,视图中只保留轻量编排;通过抽取专用子视图类型缩短过长 body,避免用大量 computed some View 辅助重建界面;确保视图结构稳定,避免顶层基于 if 的分支切换,把条件移到局部区块或修饰符;若 view model 已存在或被明确要求,用非可选、在 init 中初始化的 @State view model 替换可选 view model;确认 Observation 用法(iOS 17+ 根 @Observable 模型用 @State,仅在部署目标要求时用遗留包装器);保持行为不变,除非被要求,不修改布局或业务逻辑。

大型视图处理:当 SwiftUI 视图文件超过约 300 行时,应积极拆分,把有意义的区块抽取为专用 View 类型,而不是把复杂度藏在大量 computed 属性中。可用带 // MARK: - 注释的私有扩展放置动作和辅助,但扩展不能替代把巨大界面拆分为更小的视图类型。若抽取的子视图被复用或可独立表达,应移入单独文件。

限制:仅在任务明确匹配上述范围时使用该技能;不应将输出视为环境特定验证、测试或专家评审的替代;若缺少必要输入、权限、安全边界或成功标准,应停止并请求澄清。