最近 AI 编程辅助工具火得一塌糊涂,尤其是 Claude Code 这种号称能直接读代码库、自动改代码的神器,加上 MiMo 2.5Pro 这种新模型的加持,简直是让开发者觉得“以后不用自己写代码了”。

但我得用亲身经历给大家泼盆冷水:在真实项目中,尤其是处理遗留代码时,它们现在的表现可能还没你想象的那么聪明。

背景:OC/Swift 混编项目的“去 OC 化”计划

我手头有个老项目,典型的 Objective-C (OC) 和 Swift 混编架构。业务层大部分已经迁移到了 Swift,只剩下一小部分 OC 代码和一些不得不用的 OC 第三方 SDK。

为了降低维护成本,统一语言栈,我计划把业务层全量迁移到 Swift。这不是个巨大的项目,我采取的策略是“蚕食”——按模块逐步推进。

第一个模块:看似简单的开局

:rofl:

Claude Code + MiMo 2.5Pro: 理想是代码重构,现实是报错大赏

第一个目标模块非常小,拢共就 20 多个类,代码量撑死也就几千行。逻辑也不算复杂,我心想:这不就是 Claude Code 和 MiMo 2.5Pro 秀肌肉的最佳场景吗?

准备工作:

  1. 确保代码库上下文能被工具读取。
  2. 明确指令:将指定模块下的所有 OC 类转换为 Swift,并保持原有接口兼容性。
  3. 信心满满地按下了“执行”。

结果:一下午的“报错大赏”

原以为最多花个一两小时处理一点边缘情况就能跑通,结果我整整耗了一个下午,编译器依然疯狂报错。

主要遇到的问题:

  1. 内存管理的“翻车现场”:OC 的引用计数和 Swift 的 ARC 虽然看起来像,但在复杂对象图的转换中,AI 居然搞混了强弱引用,直接导致了潜在的野指针问题,甚至还有一些本该用 weak 的地方用成了 strong,造成了循环引用。

  2. Runtime 特性的丢失:OC 代码里用了很多动态特性(比如 performSelector、方法 Swizzling 或者动态创建类)。Claude Code 在翻译时,直接把这些删掉了,改成了静态的 Swift 调用,结果运行时直接找不到符号。

  3. 第三方 SDK 的桥接噩梦:虽然业务逻辑层没太大问题,但在调用 OC 第三方 SDK 时,AI 生成的 Swift 封装层极其生硬。很多需要传递特定 OC 对象的地方,它试图用纯 Swift 类型去强转,导致类型不匹配。

  4. 宏定义的处理:OC 中复杂的宏定义,特别是带参数的宏,AI 根本没办法理解其语义,要么硬编码展开,要么直接报错说无法解析。

为什么会这样?

开发者与 AI 协作修复遗留代码

面对遗留代码,人机协作才是最高效方案

冷静下来分析,这次翻车其实并不意外。

  • 上下文窗口的有效性:虽然模型上下文很大,但在处理涉及整个项目依赖关系时,AI 往往只能关注局部代码,忽略了 Header 文件里的隐式依赖。
  • 语言范式的差异:OC 是动态语言,Swift 是强静态语言。这种“翻译”不仅仅是语法的转换,更是设计模式的改变。目前的 AI 模型更擅长模仿代码的“形状”,而难以理解深层的设计语义。
  • 缺乏“业务理解”:AI 不知道这个类在整个 App 生命周期里是被谁调用的,也不知道某个变量在特定场景下的特殊含义。

如果非要用 AI 做迁移,该怎么避坑?

虽然这次没跑通,但我总结了一些经验,如果你要用 Claude Code 或类似工具做类似工作,建议参考:

  1. 切分粒度要极细:不要一次性扔给 AI 一个包含几十个文件的模块。最好是一次重构一个类,甚至是一个方法。逐步验证,逐步集成。

  2. 保留测试用例:这是底线。在重构前,必须保证该模块有对应的单元测试。AI 改完代码,必须跑一遍测试,不通过就回滚或手动修补。没有测试的代码千万别让 AI 大动干戈。

  3. 人机协作,而非托管:把 AI 当作“高级补全工具”,而不是“外包工程师”。它生成的 Swift 代码可能有 70% 是对的,剩下 30% 的 Runtime 问题、内存管理细节必须由资深开发者人工Review和修正。

  4. 关注 Bridging Header:在混编项目中,桥接文件是关键。重构时要手动维护好 ProjectName-Bridging-Header.h,确保 AI 知道哪些 OC 类是暴露给 Swift 的。

总结

Claude Code + MiMo 2.5Pro 的组合在写新代码、写单元测试或者解释复杂逻辑方面确实很强,但在处理“屎山”代码迁移这种脏活累活时,千万别指望它能一键搞定

技术迭代很快,但在现阶段,对于核心遗留代码的重构,经验丰富的大脑 + AI 辅助补全依然是最高效、最稳妥的方案。别为了赶那一两个小时的进度,给项目埋下一周的坑。

标签: none

评论已关闭