원클릭으로
xxf-aaa-class-declaration-guidelines
规范 ViewController 与 ViewModel 的分区组织方式。用于治理成员变量和方法过多、顺序混乱、阅读成本高的问题;通过 MARK 分区和职责分层保持代码导航清晰。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
规范 ViewController 与 ViewModel 的分区组织方式。用于治理成员变量和方法过多、顺序混乱、阅读成本高的问题;通过 MARK 分区和职责分层保持代码导航清晰。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
创建 XXF iOS 列表页模板(DiffableDataSource + BaseCollectionViewCell + StatefulView + 分页 ViewModel)
处理 XXF iOS 项目中的通用编码任务交付流程。用于 bugfix、功能开发、重构、回归修复等未显式指明测试或 review 的日常 coding 请求;负责自动串起模块 skill、补测、验证、代码审查与风险门禁。
iOS 性能门禁与主动鉴别。针对常规 coding 改动自动识别性能风险(主线程阻塞、列表卡顿、内存抖动、启动耗时、无效并发、过度渲染),并执行最小可行验证与门禁结论,不依赖用户额外提示。
Vibe Coding 通用治理闭环。用于把模糊需求转成可验证交付:先定义问题与边界,再走拼好码优先、最小改动、硬门禁验证、证据化交付和风险结论。适用于需求澄清、实现前规划、AI 协作治理、质量门禁落地。
XXFViewModel MVVM 的 VM 基类与生命周期。当用户要写 ViewModel、绑定 View、处理输入输出流,或询问"XXF 的 MVVM 怎么用"时使用。若出现 ViewModel 成员或方法膨胀、顺序混乱,应联动 `xxf-aaa-class-declaration-guidelines` 做分区治理。
产出 ADR/RFC 技术决策文档,明确背景、备选方案、权衡、风险、迁移与回滚策略,避免口头决策和重复争论。
| name | xxf-aaa-class-declaration-guidelines |
| description | 规范 ViewController 与 ViewModel 的分区组织方式。用于治理成员变量和方法过多、顺序混乱、阅读成本高的问题;通过 MARK 分区和职责分层保持代码导航清晰。 |
| allowed-tools | Read, Glob, Grep, Edit, Write |
让 VC/VM 在大纲中可快速导航:
适用范围:新建或重命名的 VC/VM 主文件与职责 extension 文件(如 XxxViewController.swift、XxxViewModel.swift、XxxViewController+UI.swift)。
//
// 文件名.swift
// 项目名
//
// Created by git用户名 on 年/月/日
// 作用(一句话介绍)
//
文件名.swift、项目名、git用户名、年/月/日、作用(一句话介绍)。作用必须一句话写清该文件唯一职责,禁止空泛描述(如“处理逻辑”“相关代码”)。生成 Swift 文件时按以下顺序自动填充:
文件名.swift:使用当前真实文件名,并保持与主类型名一致(遵循 xxf-aaa-coding-style)。项目名:优先使用当前 target/module 名;无法确定时回退为仓库目录名 xxf_ios。git用户名:优先 git config user.name;为空时回退 git config user.email 的本地部分;仍为空则使用系统用户名。年/月/日:使用当前本地日期,格式固定为 yyyy/MM/dd(示例:2026/05/21)。作用(一句话介绍):根据主类型与文件职责自动推断并填充,不可留空。建议推断模板:
*ViewController.swift:负责 <页面/场景> 的展示、交互与生命周期编排。*ViewModel.swift:负责 <页面/场景> 的状态管理、输入处理与数据编排。+UI.swift:扩展 <主类型> 的 UI 搭建与布局职责。+Bind.swift:扩展 <主类型> 的状态绑定与事件绑定职责。+Event.swift:扩展 <主类型> 的事件处理职责。+Data.swift:扩展 <主类型> 的数据请求与数据组装职责。+Actions.swift:扩展 <主类型> 的交互响应职责。/// 文档注释,不要只写无信息注释(如“按钮点击”)。示例:
// MARK: - Business State
/// 当前分页页码。首屏为 1,成功加载下一页后递增。
var pageIndex: Int = 1
/// 是否还有更多数据可加载。由服务端分页结果更新。
var hasMore = true
// MARK: - Data Request
/// 拉取下一页数据并合并到现有列表。
/// - Note: 该方法会更新 `pageIndex` 与 `hasMore`,并触发输出状态变化。
func loadNextPage() { ... }
至少按以下类别分区:
示例:
final class OrderDetailViewController: UIViewController {
// MARK: - Input
/// 订单 ID,由上一个页面或路由传入,用于请求详情。
var orderID: String
/// 进入来源,用于埋点和页面行为差异处理。
var source: OrderSource
// MARK: - UI
/// 页面标题,用于展示订单核心信息。
private lazy var titleLabel = UILabel()
/// 支付按钮,触发支付动作。
private lazy var payButton = UIButton(type: .system)
/// 详情列表容器,承载明细模块。
private lazy var tableView = UITableView()
// MARK: - State
/// 页面当前状态,用于驱动渲染。
private var state: ViewState = .idle
/// 当前已选优惠数量,影响按钮文案和金额展示。
private var selectedCouponCount = 0
// MARK: - Dependencies
/// 详情页业务逻辑入口,负责数据请求与状态产出。
private let viewModel: OrderDetailViewModel
}
至少按以下类别分区:
示例:
// MARK: - Lifecycle
/// 页面加载入口:初始化视图、绑定事件并触发首屏请求。
override func viewDidLoad() { ... }
// MARK: - Setup UI
/// 搭建页面 UI 组件层级与样式。
private func setupUI() { ... }
/// 设置布局约束与安全区适配。
private func setupLayout() { ... }
// MARK: - Bind
/// 绑定 ViewModel 状态输出到 UI 渲染逻辑。
private func bindViewModel() { ... }
/// 绑定按钮点击、手势等用户事件。
private func bindActions() { ... }
// MARK: - Data
/// 拉取页面所需数据并驱动状态更新。
private func fetchData() { ... }
// MARK: - Render
/// 根据状态刷新页面内容与交互可用性。
private func render(_ state: ViewState) { ... }
// MARK: - Actions
/// 处理支付按钮点击事件并发起支付流程。
@objc private func payButtonTapped() { ... }
// MARK: - Helpers
/// 生成价格富文本展示内容。
private func makePriceText() -> NSAttributedString { ... }
至少按以下类别分区:
Obs / Flow / Driver)示例(对应你给的场景):
final class OrderListViewModel {
// MARK: - Input
/// 搜索关键词输入,用于构建查询条件。
var keyword: String
/// 页面来源输入,影响默认筛选策略。
var source: EntrySource
// MARK: - Output State
/// 文本状态 A,对外暴露给 View 层订阅。
var stateA: Obs<String>
/// 文本状态 B,对外暴露给 View 层订阅。
var stateB: Obs<String>
// MARK: - Business State
/// 当前分页页码,首屏为 1。
var pageIndex: Int = 1
/// 是否还有下一页数据可继续加载。
var hasMore = true
// MARK: - Dependencies
/// 数据仓库依赖,负责请求与持久化访问。
private let repository: OrderRepository
}
至少按以下类别分区:
示例:
// MARK: - Lifecycle
/// 初始化 ViewModel 默认状态与必要订阅。
func setup() { ... }
// MARK: - Input Handling
/// 处理刷新意图,重置分页并拉取首屏数据。
func didTapRefresh() { ... }
/// 处理关键词变更并触发重新查询。
func didChangeKeyword(_ keyword: String) { ... }
// MARK: - Data Request
/// 加载第一页数据并覆盖当前列表状态。
func loadFirstPage() { ... }
/// 加载下一页数据并追加到现有列表。
func loadNextPage() { ... }
// MARK: - State Mutation
/// 合并分页结果并更新 `pageIndex` / `hasMore`。
private func applyPageResult(_ result: PageResult) { ... }
// MARK: - Output
/// 发出错误事件供 View 层展示错误态或提示。
private func emitError(_ error: Error) { ... }
// MARK: - Helpers
/// 构建请求查询参数,屏蔽上层组装细节。
private func buildQuery() -> Query { ... }
当方法增长后,优先按 extension 职责拆分到独立文件:
XxxViewController+UI.swiftXxxViewController+Bind.swiftXxxViewController+Event.swiftXxxViewController+Actions.swiftXxxViewController+Data.swift同一 extension 文件内部仍需 MARK 分区,避免“拆了文件但文件内部继续混乱”。
当命中触发场景时,本 skill 的默认动作:
Input、UI、State、DependenciesInput、Output State、Business State、DependenciesLifecycle、Setup UI、Bind、Data、Render、Actions、HelpersOther、Temp、Misc。xxf-aaa-delivery-loop 编排xxf-aaa-coding-style 约束xxf-aaa-coding-arch / xxf-aaa-architecture-review 处理xxf-viewmodel 约束