海量的现有代码库: 想象一下,一个大型的 App,比如微信、淘宝、或者苹果自家的很多经典应用,它们可能积累了数百万行甚至千万行的 OC 代码。这些代码经过了时间的洗礼,稳定可靠,承载着核心的业务逻辑和用户体验。让这样一个庞大的代码库在短时间内完全迁移到 Swift,其难度不亚于在高速运行的列车上更换引擎,成本之高,风险之大,是显而易见的。 成熟的生态和工具链: OC 已经有了一套非常成熟的开发工具、库和框架。虽然 Swift 也在快速发展,但总会有一些领域,OC 的工具和库依然更成熟、更稳定,或者拥有更多社区支持的解决方案。 经验丰富的开发者群体: 这么多年下来,积累了庞大的 OC 开发者群体。这些开发者对 OC 的掌握程度非常高,能够快速有效地解决问题。而 Swift 的开发者虽然越来越多,但在一些深度和广度上,可能还需要时间来沉淀。
二、Swift 的“成长烦恼”与“生态壁垒”
Swift 虽然设计理念先进,但在发展的早期,也并非完美无缺,这些“成长烦恼”在一定程度上延缓了其取代 OC 的进程。
早期版本的“不稳定性”: Swift 在诞生后的几年里,版本迭代非常快,而且存在一些“Breaking Change”(不兼容的更改)。这意味着,你用 Swift 2.x 写的代码,可能在 Swift 3.x 就不能直接运行了,需要进行大量的迁移和调整。这种不稳定性让很多团队在采用 Swift 时持观望态度,尤其是在那些对稳定性要求极高的项目上。 与 OC 的互操作性: 尽管苹果做了很多努力,让 Swift 和 OC 能够互相调用(Bridging),但这种互操作性在某些复杂场景下,仍然存在一些性能损耗或使用上的不便。如果一个项目需要大量与 OC 代码进行交互,那么引入 Swift 可能会增加额外的复杂性。 部分底层框架的“OC 依赖”: 即使你用 Swift 编写应用,但在底层,很多苹果提供的框架(比如 UIKit、Foundation 等)仍然是用 OC 实现的。Swift 只是对这些 OC 框架进行了一层封装和调用。虽然 Swift 开发者无需直接关心 OC 的细节,但当遇到一些底层的、或者非常底层的性能优化问题时,了解 OC 的工作原理会更有帮助,甚至不得不直接使用 OC 才能解决。 ObjectiveC Runtime 的强大: OC 依赖于 ObjectiveC Runtime,这是一个非常灵活和强大的机制,允许在运行时进行很多动态的操作,比如消息转发、方法替换等。这些特性在某些高级的开发技巧和框架(如 KVC、KVO、Aspects 等)中发挥着重要作用。虽然 Swift 也在努力实现类似的动态特性,但在某些方面,OC 的 Runtime 仍然具有一定的优势,或者说,基于 Runtime 的很多成熟方案,直接迁移到 Swift 可能需要重新设计。
三、现实的考量:成本、风险与效率
回到实际的开发场景,技术选择从来不仅仅是“哪种语言更好”,更多的是“哪种选择最适合当前的项目”。
迁移成本: 前面已经提到,大规模的代码迁移是昂贵且耗时的。这不仅仅是代码的重写,还包括测试、调试、团队培训等一系列环节。对于那些已经盈利、或者有明确交付周期的项目,贸然进行大规模迁移的风险实在太高。 团队技能匹配: 并非所有团队成员都熟悉 Swift。如果一个团队以 OC 开发者为主,那么在短时间内要求他们全面拥抱 Swift,并保持原有的开发效率,是有难度的。渐进式地引入 Swift,或者在招聘时优先考虑 Swift 开发者,是更现实的做法。 项目生命周期: 对于一些生命周期不长的项目,或者一些内部工具类的应用,使用团队最熟悉的语言(即使是 OC)可能比学习和迁移到 Swift 更具性价比。 第三方库的兼容性: 很多成熟的第三方库,可能依然是 OC 编写的。虽然 Swift 可以调用 OC,但如果一个项目高度依赖某个 OC 的第三方库,且该库尚未提供 Swift 的封装,或者 Swift 的封装存在问题,那么在项目中使用 Swift 就会受到限制。
四、Swift 的“渗透”与“共存”
尽管 OC 依然坚挺,但 Swift 的影响力是毋庸置疑的。这五年,Swift 也在不断成长,并且在以自己的方式“渗透”和“重塑”着 iOS 开发。
新项目普遍采用 Swift: 对于全新的项目,或者代码量相对较小的项目,Swift 已经成为主流选择。开发者们更愿意使用 Swift 来开启新的征程。 渐进式迁移: 许多大型项目并没有进行“一次性”的全部迁移,而是采取了“渐进式”的迁移策略。比如,新开发的模块使用 Swift,然后逐步将一些 OC 的模块用 Swift 重写,或者在 OC 项目中引入 Swift 文件。这种方式既能享受到 Swift 的优势,又能控制迁移的风险。 Swift 语言特性的吸引力: Swift 的函数式编程、泛型、枚举、属性包装器等特性,极大地提高了开发效率和代码的可读性。这些都吸引着开发者主动去学习和使用 Swift。 苹果的推动: 苹果官方一直在大力推广 Swift,并且将越来越多的新框架和 API 用 Swift 来实现。这无疑也给 Swift 的普及提供了强大的动力。
总结一下,为什么五年了 OC 依然是主流?
这绝非 Swift 不够好,而是因为:
1. OC 拥有一个极其庞大且成熟的存量代码库和生态系统,迁移成本巨大。 2. Swift 在早期确实经历过一些不稳定的版本,以及与 OC 互操作性上的挑战。 3. 实际开发中,项目需求、团队能力、以及成本效益的考量,使得激进的迁移并非最优解。 4. Swift 更多的是在“渗透”和“共存”,新项目以 Swift 为主,老项目也在逐步引入。
所以,与其说是 Swift “取代”了 OC,不如说是 Swift 正在逐步融入并重塑 iOS 的开发格局。 OC 的强大生命力,正是其在历史长河中积累的技术深度和经济可行性的体现。而 Swift 的崛起,则代表了技术发展的趋势和对未来开发模式的探索。