本节书摘来自华章计算机《swift ios应用开发实战》一书中的第1章,第1.1节,作者:刘铭 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
swift是苹果在wwdc 2014所发布的一门编程语言,用于开发ios和os x应用程序。
2010年7月llvm编译器的原作者暨苹果开发工具部门总监克里斯·拉特纳(chris lattner,就是在wwdc 2014大会上亲自演示swift代码的那位仁兄)开始着手开发swift语言,一直到2014年6月发布,swift大约经历了4年的开发期。在wwdc 2014大会中,苹果宣称swift的特点是:快速、现代、安全和具有交互性。
swift的处理速度非常快。在wwdc上,苹果展示了swift、objective-c以及python的速度对比,swift比objective-c快1.4倍,比python快3.9倍,如图1-1所示。在进行rc4加密算法测试中,swift则是python的220倍。但笔者认为苹果在这里使用了障眼法,因为每门编程语言都有其优缺点,如果非要用自己的长处与别人的短处相比,明显有些小气了。
在笔者看来,swift就像是一门可以被编译的脚本语言。因为在很多语法特性上swift和一些脚本确实非常相似。但是,在应用程序开发中,swift不是以一门脚本语言来运行的,所有的swift代码都会被llvm编译为本地代码,然后以极高的效率运行。

swift和objective-c都是类型安全的语言,变量和方法都有明确的返回,并且变量在使用前需要进行初始化。而在语法方面,swift迁移到了业界公认的非常先进的语法体系,其中包含了闭包、多返回、泛型和大量的函数式编程的理念,函数终于可以作为变量保存了。初步看来,swift在语法上借鉴了ruby的很多人性化设计,但借助苹果自己手中强大的llvm编译器,在性能上必然要甩开ruby很远。
从另一方面说,swift的代码又是可以通过交互来“解释”执行的。xcode 6加入了所谓的playground功能来对开发者输入的swift代码进行交互式响应,当然,我们也可以使用swift的命令行工具交互式地执行swift语句。这里之所以把“解释”两个字打上双引号,是因为即使在命令行中,swift其实不是被解释执行的,而是在每条指令后都从开始的swift代码全部进行编译,然后执行。这样的做法依然可以让人“感到”是在做交互解释执行,由此这门语言的编译速度和优化水平可见一斑。同时playground还顺便记录了每条语句在执行时的各种情况,称做一组timeline。我们可以使用timeline对代码执行逐步检查,省去断点调试的时间,也很方便,如图1-2所示。
不知大家是否有这样的想法:既然苹果的生态系统做得这样出色,为什么还要推出一门全新的语言,这不是自找麻烦吗?在wwdc 2014大会上,克雷格·费德里吉(craig federighi)给出了这样的答案:苹果一直使用xcode作为mac和ios平台的开发工具,而xcode的核心是我们用来开发应用的objective-c语言,它已经为我们服务了20多年,我们很喜欢它。但我们必须问自己一个问题,一个没有c的objective-c会是什么样子?
苹果不仅仅想了,还将其付诸实践,因此出现了swift语言,并且苹果希望使用swift来主导该领域。苹果将swift视为“亲生儿子”,并把它视为objective-c的继承者。作为ios或mac的开发者,笔者深感学习和使用swift的必要性。现在swift可以和原来的objective-c或c代码混用(不同于objective-c和c++或c在同一个.mm文件中的混编,swift文件不能和objective-c代码写在同一个文件中,需要将两种代码分开)。编译出来的二进制文件是可以运行在ios 7和ios 8设备上(不支持ios 6及之前的系统)。
现在xcode 6中所有的文档都有objective-c和swift两种语言版本,并且按照苹果开发者社区的一贯跟进速度,有理由相信在不久的将来,苹果很可能会逐步废弃对objective-c的支持,而全面支持swift。所以,关于到底是学swift还是objective-c的问题,笔者的建议是,尽快学习swift,尽快使用swift。在苹果无数工程师和语言设计天才的努力下,swift吸收了众多语言的精华,应该是当下最新也是最先进的一门编程语言之一。我想,也正是苹果对这门语言有这样的自信,才会在公司全盛的时候,不墨守成规,如此大胆地推出新的语言。因为苹果必定比你我都更明白,更换语言带来的利必须远大于弊,才会值得冒如此大的风险。从这个意义上来说,wwdc 2014大会就是程序开发业界的一枚重磅炸弹,也必将写入史册,而你我身在其中,变成了这段历史的见证者。修改一位伟人的话:苹果开发是swift的,也是objective-c的,但归根结底是swift的。