有关 Swift 的一些事
昨天晚上我和一些本地的开发者们聊了聊 Swift。其中一些内容至今仍徘徊在我的脑海之中。例如下面这个问题:
问题
两年之后,你的公司正在招聘,在所有应征者中最优秀的那位有一个问题:她的开发经验仅限于 Swift 语言,对于 Objective-C 并不熟悉。但是可以确定她对于 SDK 非常熟悉并且有能力交付高质量的软件。
而你所拥有的规模相当庞大的旧代码都是使用 Objective-C 的。可能也有小部分功能开始使用 Swift 开发,也可能没有,可能你已经计划在后续的开发中更多地使用 Swift,也可能没有。那么问题来了:
你是否会雇佣这个人?
学习 Swift 是困难的
Objective-C 看上去很难学,因为少见的中括号语法 [ 和 ] ,以及那些长长的函数名。事实上它有一些古板和刻薄,像一个眉毛浓密的老爷爷生气地要求你完整地拼写“I am laughing out loud”,而不是使用缩写 LOL。
但是相比于 Swift,Objective-C 其实是更容易学的。初看 Swift 你可能会觉得它很简单,所有 JavaScript 程序员都会觉得 Swift 的语法非常熟悉,甚至很多人认为他们开发原生应用的好日子到了。
我相信这种大家更熟悉的语法会帮助更多的人起步。但是很快你会遇到一些 Objective-C 中根本不会碰到的概念(例如:optional, generic 和 tuple),还有一些 Objective-C 中不需要过多考虑的概念(例如:值和引用,函数式设计和严格类型安全)。并且你一定会遇到如何和 Objective-C 代码交互的问题,如果你只使用 Objective-C 开发这显然不是一个问题。
Angle-bracket-T Blindness
为了说明下面这个观点我可能会有一点夸张——OK,应该是相当夸张。大多数有关 Swift 的博客有一个共同的模式,这个模式如下:
下面是旧式的做法:
1 2 3 |
for (id oneObject in someCollection) { [self doSomethingWithObject:oneObject]; } |
你可以直观地看到这是多么糟糕的做法。不易理解的循环和没有类型声明的变量,让我们用更现代的方法来改写它:
[snip]
[snip 200 lines of code]
1 |
func x<T> -> x<U> <TT> (in U -> <T>){$1 $2}.map(func y(T)<T><T> -> <U> infix $3 { |
很明显以上这个例子是有意地进行了夸张,所以非常荒谬和无意义。可能对于 Swift 来说这有点不公平,但是我相信任何像我一样读过许多有关 Swift 文章的人都会理解我在试图表达什么。
(有许多博客上有关 Swift 的文章是很棒的。我最喜欢的两个分别是 NSHipster 和 David Owens II,但是我依然会时不时遇到 angle-bracket-T blindness,即使是他们写的文章。)
Objective-C 并不会停止改变
这是一个预测。苹果显然拥有比任何人更多的 Objective-C 代码。改进 Objective-C,特别是为了让开发者们可以变得更高效、做出更优秀的 APP 的改进,是对苹果有好处的。
可能我们会迎来的是更多的融合,Objective-C 会变得更加容易和 Swift 在同一个项目里共同工作。
我一直觉得对于苹果来说,改进 Objective-C 显然比用 Swift 重写所有代码要来得容易得多。
但是 Swift 毫无疑问是未来
即使处在一个非常早期的阶段,Swift 的使用情况和开发者们对他的热情,已经超出了我的预期。如果你拥有一个开发者帐号,你可以浏览一下苹果的 Swift 论坛。
现在的情况是,当你搜索有关最新的 API 的问题时,你极有可能会碰到的是 Swift 代码。至少在我身上这种事情已经发生过许多次,我需要将 Swift 代码转换到 Objective-C 去,没有想到这种情况来得这么早。
Swift 已经来了。
P.S.
最后,我会雇佣只拥有 Swift 经验但是没有 Objective-C 经验的人。