iOS Cursor 使用心得
最近在使用 Cursor 过程中,业务需求基本上 80% 代码由 AI 开发。
本文把过程中的一些心得记录分享一下。
基础配置
先介绍一下基本的配置。
个人使用的 Rules:
使用中文回复
每次生成代码前,先概述你的方案,等我确认后再生成代码
仅做最小改动,不要动任何我别的代码逻辑和注释,不调整注释的标点符号
不添加 log,只保留最关键的注释,注释使用中文
由于不同地方使用的风格不同,具体代码风格在 prompt 再单独指定。
自己记录在笔记中,方便快速粘贴,如:
public class SomeView: UIView {
// 定义 UI 子控件,如
let textLabel = UILabel()
let imageView = UIImageView()
override init(frame: CGRect) {
super.init(frame: frame)
// 对 UI 子控件进行布局
textLabel.sk_added(to: self).then({ cur in
// 此处设置 UI 展示属性
cur.font = .systemFont(ofSize: 17, weight: .regular)
}).sk_layout { make in
// 此处设置布局代码,使用 SnapKit 语法
make.left.equalTo(12)
make.height.equalTo(24)
make.top.equalTo(16)
make.bottom.equalTo(-14)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Vibe Coding
图片展示了整个 AI 辅助编程的个人流程。
下面针对这个流程逐项再展开说明下。
0、前提掌握
上图是市面上常用的 AI 编程工具,按使用者的可控制程度排列。
虽然目前市面上已经有很多 0 基础 AI 编程工具,但是对于有准确性要求的商业项目开发,或者希望代码能够由人工交替维护,还是需要把控整体的架构。
所以哪部分知识是 Vibe Coding 下比较重要的部分?个人认为有以下几点:
-
某个领域的核心概念:拿 iOS 举例的话可能有 Swift 语法、UIKit 的使用方法、如何调试程序
-
对最佳实践的把握(代码品味):SOP、模板、规范
而在 AI 的帮助下,我们也可以更快速地入门某个专门领域。
而代码品味则需要一定时间的工作沉淀,但在不同的领域里是可以共享的。
1、领域驱动,数据设计先行
在开发前,先确认好数据,包含以下维度
- UI 需要用到的 ViewModel
- 存储或与后台交互的 Model
当然,数据的设计也可以让 AI 进行,我们做一个 review 和调整。
这样做的好处是,后续 AI 将围绕固定的数据处理来进行编码,相当于提供了上下文和约束,会更容易得到想要的结果。
而对于已有的项目,则可以让 AI 先生成数据处理流程的文档,也方便自己快速了解逻辑。
这里的思路就是将步骤拆解成 SOP,每一步进行人工的确认,确认后作为下一步的前提。
下面在逻辑开发过程中,也会遵照这一思路进行。
2、逻辑开发,Feature 维度
在 rules 中,有这样一句:“每次生成代码前,先概述你的方案,等我确认后再生成代码”。
这样做有两方面的好处:
- 对话中,AI 会将前文都带上,先输出方案作为后续代码生成的上下文,有利于代码准确
- 可以检查方案的可行性,如果不合适可以先进行调整
另外一点是以 Feature 的维度进行开发,特别是对于复杂的 controller。
具体含义是:实现某个功能的时候,先将相关的功能拆分出来,放入一个单独的 Feature 类,后续的开发限定在这个 Feature 类内进行。
这样做的好处主要是:
- 本身也是一种防止 Massive Controller 的实践,有利于代码的高内聚、低耦合
- 防止 AI 对其它无关代码进行修改(虽然 rules 说明了不要这样做,但 AI 还是会忍不住,特别是对于把注释的中文引号改成英文引号,claude 模型似乎有一种执念 😂)
3、Feature 完成,实时重构
在功能开发过程中,由于是通过多次和多轮对话进行的,AI 生成的代码难免会存在冗余的毛病。
在功能完成后,我们可以要求 AI 对 Feature 进行一次重构,让其优化代码风格、抽离重复的部分。
实际效果来看,AI 能出色地完成该任务。
这也体现了我们按 Feature 维度进行开发的好处,可以有效限制重构的范围。
Git Tips
勤提交,完成一个功能点后提交一下,防止 AI 后续改乱
但对于功能点过程中的多轮生成,每次都提交比较繁琐,提交也会过多而且不完整
个人比较习惯通过暂存区来阶段性提交,将已接受的和新生成的分离开
完成一轮之后,把接受的改动放入暂存区,此时 Cursor 也会自动算作 accept
再继续进行下一轮生成时,新的改动会在未暂存区,单独看这部分即可
参考
氛围编程 Vibe coding - 维基百科,自由的百科全书
AI 工具对比 I ranked every AI Coder: Bolt vs. Cursor vs. Replit vs Lovable
领域驱动 Domain Modeling: What you need to know before coding | Thoughtworks
Cursor 技巧 CursorHub教程
Cursor iOS 开发(供参考,个人还是 Cursor 生成、Xcode 运行比较顺手) How to use VSCode/Cursor for iOS development | by Thomas Ricouard | Medium