本节书摘来自华章计算机《Swift iOS应用开发实战》一书中的第1章,第1.1节,作者:刘铭 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.1初识Swift
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的。