1. 2万行 SwiftUI App 背后:Claude Code 到底替开发者做了什么
一个 2 万行的 macOS 原生应用,手写代码不到 1000 行,Claude Code 生成比例约 95%。这不是演示 Demo,而是已经上架、能自动更新、带崩溃符号上传的完整产品。很多人看到这个数字第一反应是“标题党”,但真正值得关注的不是比例,而是它跑通了一条可复制的链路:从工程结构搭建、SwiftUI 界面迭代,到构建、测试、打包、发布,代理全程参与。
如果你正在做 SwiftUI 或 Swift 项目,想把这套工作流搬进自己的 IDE,这篇会给你一份能直接抄的配置骨架。核心思路只有一句话:Claude Code 负责在循环里改代码、跑构建、读报错、再改,你负责给它足够的上下文和明确的验收标准。而要让这个循环稳定跑起来,第一步不是写 prompt,而是把模型接入层配置好——我用 TaoToken 统一管理 Key 和 API 地址,后面所有配置示例都基于它展开。
适合谁看:已经会用 Xcode 但没系统用过代理式编码的 Swift 开发者;想把 Claude Code 接进现有工程、又不想被各种 Key 和地址搞晕的人;以及好奇“95% 生成比例”在真实项目里怎么落地的人。下面从工程结构开始,一步步给配置、给命令、给验证动作。
2. 前置准备:用 TaoToken 统一 Key 与 API 接入
Claude Code 默认走 Anthropic 官方接口,但在多工具、多项目的场景下,每个工具各配一套 Key 很容易乱。TaoToken 的作用是把模型调用收敛到一个入口:一个 Key、一个 API 地址,Claude Code、模型对话、Coding Plan 都从这里走。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api 。
操作顺序建议这样:先注册并进入控制台创建 API Key,拿到形如sk-xxxx的密钥;然后在 Claude Code 的环境变量或配置文件里指向 TaoToken 的 API 地址。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 管理页是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。如果你还没决定用哪个模型,可以先去模型对话页试一下手感: https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。
注意:Key 只存在本地环境变量或本地配置文件里,不要提交进 Git 仓库。Swift 项目里尤其容易把
.env误提交,建议在.gitignore里提前加一行。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面写了不同客户端的地址填法。Claude Code 这类终端代理,通常通过ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY两个环境变量接管,下一节给具体写法。
3. 可复制配置:settings.json 与 config.toml 骨架
Claude Code 的配置分两层:一层是环境变量,决定它请求哪个 API 地址、用哪个 Key;另一层是项目内的CLAUDE.md和工具配置,决定它在这个 Swift 工程里怎么干活。先把环境变量写进 shell 配置,macOS 上一般是~/.zshrc:
# ~/.zshrc export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的TaoToken密钥"改完执行source ~/.zshrc,再用echo $ANTHROPIC_BASE_URL确认生效。这一步做完,Claude Code 的所有请求都会走 TaoToken,不用在每个项目里重复配。
接下来是项目级配置。Claude Code 支持settings.json来声明权限、工具白名单和默认行为。放在项目根目录的.claude/settings.json:
{ "permissions": { "allow": [ "Bash(swift build:*)", "Bash(swift test:*)", "Bash(xcodebuild:*)", "Read", "Edit", "Write" ], "deny": [ "Bash(rm -rf:*)", "Bash(git push --force:*)" ] }, "env": { "SWIFT_VERSION": "6.0" } }allow里放的是代理高频调用的命令,deny是防止它误操作。Swift 项目里swift build和swift test必须放行,否则反馈循环跑不起来。
如果你用的是支持config.toml的客户端或自建代理层,可以这样写:
# config.toml [api] base_url = "https://taotoken.net/api" api_key_env = "ANTHROPIC_API_KEY" timeout_seconds = 120 [model] default = "claude-sonnet-4" fallback = "claude-opus-4" [project] context_files = ["CLAUDE.md", "README.md"]context_files是每次会话自动加载的上下文文件,把CLAUDE.md放进去,代理一进项目就知道你的技术栈约定。
然后是CLAUDE.md,这是提升 SwiftUI 生成质量最关键的一个文件。参考实战经验,内容可以这样写:
# Context 项目约定 - 所有功能优先用 SwiftUI 实现,除非某特性仅 AppKit 可用。 - UI 遵循 Apple Human Interface Guidelines,图标用 SF Symbols。 - 面向最新 macOS,不考虑旧版本兼容。 - 使用 Swift 6 语言特性,优先 async/await、actors 和宏。 - 遇到 "unable to type-check in reasonable time" 时,把 body 拆成多个小表达式。这几行看着简单,但能明显减少代理误用 Objective-C 旧 API、或在 SwiftUI 场景里塞 AppKit 的概率。
4. 验证请求:从一次构建到一次成功运行
配置写完必须验证,否则你不知道请求到底有没有走通。第一步,在终端里直接发一个最小请求,确认 Key 和地址可用:
curl https://taotoken.net/api/v1/messages \ -H "x-api-key: $ANTHROPIC_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-sonnet-4", "max_tokens": 64, "messages": [{"role": "user", "content": "回复 OK 两个字母"}] }'返回里带content字段且文本是OK,说明接入层通了。如果返回 401,检查 Key 是否复制完整;返回 404,检查base_url是否漏了/api。
第二步,进项目目录启动 Claude Code,让它做一件可验证的小事,比如“读一下 Package.swift,告诉我这个包支持的最低 Swift 版本”。这一步验证的是它能不能正确读取工程上下文。
第三步,跑一次真实反馈循环。给它一个明确任务:“在 ContentView 里加一个按钮,点击后把标题改成 Hello,然后运行 swift build 确认通过。”观察它是否自动执行了swift build、是否读取了报错、是否在失败后自己重试。成功标志是终端里出现Build complete,且ContentView.swift里确实多了按钮代码。
第四步,验证测试闭环。让它“为这个按钮写一个单元测试并运行 swift test”。如果测试通过,说明构建、测试、修复这条链路已经打通。实测下来,Swift Package 场景下swift test的自动化程度最高,应用级 UI 测试还需要额外工具辅助。
5. 本篇常见错排查
报错一:The compiler is unable to type-check this expression in reasonable time。这是 SwiftUI 里最典型的坑,类型推断在复杂表达式上爆炸。解决办法不是改配置,而是让代理把body拆成多个小表达式块。你可以在 prompt 里直接说“把 body 拆成多个子视图,避免复杂类型推断”,它通常能自动重构且不破坏功能。
报错二:代理选了过时的 Objective-C API。比如本该用 SwiftUI 的地方用了 AppKit。根因是训练数据里旧代码占比高。对策就是在CLAUDE.md里明确写“优先 SwiftUI、面向最新系统”,并在发现后让它重写。
报错三:xcodebuild调用失败。Claude Code 对swift build很熟,但对xcodebuild的参数经常搞不清。可以引入 XcodeBuildMCP 这类工具层,把构建和运行封装成简化工具给它调用,成功率会明显上升。
报错四:上下文快满、输出质量下降。200k token 看着多,但每轮对话都在消耗。临近上限时模型表现会变差。对策是主动用“压缩”流程,或者干脆开新会话,把关键结论写进CLAUDE.md再继续。
报错五:Key 泄露风险。如果settings.json或.env被提交,Key 就暴露了。检查.gitignore是否包含.env和本地配置目录,必要时轮换 Key。
6. 把工作流固定下来:从单次尝试到长期编码
跑通一次不难,难的是让它稳定复现。我的做法是把三件事固定成习惯:每次开新任务前先“预热”,让代理读相关源码和文档并总结;复杂功能先让它用ultrathink出计划、等你确认再动手;每个功能都要求它跑构建和测试,形成闭环。
如果你打算长期用这套流程做 SwiftUI 或 Agent 类项目,Coding Plan 会比按次调用更划算,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。Claude Code 相关的接入细节可以对照文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,ClaudeCodeAnthropic 专项说明在 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 。
最后留一个我踩过的坑:别指望一句话生成完整应用。真正让 95% 生成比例成立的,是清晰的 spec、稳定的反馈循环,和一份写对了的CLAUDE.md。把这三样配好,剩下的就是让代理一轮轮跑下去。