Swift 与 Objective-C

Swift诞生背景:Chris Lattner为什么放弃了Objective-C

开始进行iOS开发后,任何人都可能至少思考过一次:“Apple明明一直在使用Objective-C,为什么还要特意重新创建Swift呢?”

5 分钟阅读
Swift诞生背景:Chris Lattner为什么放弃了Objective-C 封面图

开始进行iOS开发后,任何人都可能至少思考过一次:“Apple明明一直在使用Objective-C,为什么还要特意重新创建Swift呢?”

我第一次用Swift开发应用时,也觉得它的语法非常简洁。但深入了解背后的故事后,才发现这其中有一段相当有趣的经历。

先说结论,Swift是一位名叫Chris Lattner的工程师从2010年开始几乎独自秘密开发的语言。他的目标是从根本上解决已经三十多年几乎没有变化的Objective-C在安全性方面的问题。

今天就来轻松梳理一下Swift是如何走向世界的,以及它诞生背后的背景。


Swift是什么时候、由谁创建的?

Swift的开发始于2010年7月

主角就是Chris Lattner。这个名字可能有些陌生,但如果你是开发者,其实每天都在使用他的作品。

正是他创建了LLVMClang编译器。它们是支撑Apple开发工具底层的核心技术。

据说在早期,这确实是Lattner一个人的项目。他下班后和周末抽时间,悄悄打磨设计的故事广为流传。

大约从2011年开始,Apple内部的其他工程师加入进来,项目逐渐发展成了正式的团队项目。

最终,Swift在2014年6月的WWDC上正式面世。据说当天在现场的开发者都大吃一惊,这场发布完全出乎所有人的预料。

同年9月,Swift随Xcode 6正式发布,从此任何人都可以使用它。


Chris Lattner为什么要用Swift替代Objective-C?

最大的原因只有一个。

Objective-C是一门在20世纪80年代初设计的语言,缺少现代化的安全机制。

简单来说,Objective-C的结构就是“在C语言上增加消息传递功能”。它完整继承了C的灵活性,但这种灵活性也意味着风险。

其中最典型的就是nil(空值)处理问题。

在Objective-C中,即使向nil对象发送消息,应用也不会崩溃。什么都不会发生,程序会悄悄继续执行。

乍看之下很方便,但这正是陷阱。由于值不存在而产生的Bug会被悄悄掩盖,最后在之后某个完全无关的地方爆发。

Lattner在创建LLVM和Clang的过程中,长期致力于解决Objective-C的内存安全问题。后来,他似乎得出了这样的结论。

“与其不断修补现有语言,不如重新创建一门从一开始就阻止错误发生的语言。”

这是一种不只是捕获错误,而是让错误本身变得不可能发生的思路。


Swift到底有哪些不同?

Swift带来的变化中,最具代表性的就是**可选值(Optional)**这一概念。

它要求在语法层面明确表示“这个值可能为空”,从而强制开发者处理没有值的情况。

看下面的代码,就能清楚地看出两门语言在设计理念上的差异。

首先,在Objective-C中,即使是nil也会直接跳过处理。

// name如果是 nil?什么都不会发生,程序会悄悄继续执行
NSString *name = [user fetchName];
NSUInteger len = [name length];  // 结果是 0, 很容易漏掉Bug

而Swift会明确要求开发者处理值不存在的可能性。

// name是 String? 类型——类型会明确表示值可能不存在
let name: String? = user.fetchName()
if let name = name {   // 只有存在值时才安全使用
    print(name.count)
}

虽然代码很短,但“放任错误不管”和“阻止错误发生”的差异清晰可见。

除此之外,Swift还兼顾了类型推断、简洁的语法和快速的执行速度,因此逐渐受到欢迎。据说Swift不仅参考了Objective-C,也借鉴了Rust、Haskell、Python、Ruby等多种语言的优点。


Swift后来发展得怎么样了?

Swift发布后迅速站稳了脚跟。

简单总结一下主要发展历程如下。

时间 事件
2010年7月 Chris Lattner开始开发
2014年6月 在WWDC上正式发布
2014年9月 随Xcode 6正式发布
2015年12月 以开源项目形式公开(Apache 2.0)
2017年1月 Lattner离开Apple,加入Tesla

有趣的是,这门语言的“父亲”Lattner在2017年离开了Apple。之后,Swift项目负责人由Ted Kremenek接任。

尽管如此,Swift至今仍稳稳占据着Apple生态系统核心语言的位置。开源后,它的应用范围也扩展到了Linux和服务端。

Lattner离开后,Swift仍在持续成长
Lattner离开后,Swift仍在持续成长

一位工程师在周末悄悄启动的项目,最终成为全世界开发者使用了十多年的语言,这一点让我印象非常深刻。

这是一门源于一个“为什么?”的问题的语言。了解它的背景后,Swift中的每一条语法都会显得不一样。

了解背景后重新审视,代码中的一行也会读出不同的含义
了解背景后重新审视,代码中的一行也会读出不同的含义

如果你刚开始学习Swift,那么只要真正理解可选值,就能大致明白这门语言为什么会这样设计。希望今天的文章能成为你的第一步。


参考资料

延伸阅读