从ShareSlide的开发看Swift语言
原文 http://www.infoq.com/cn/news/2015/06/swift-experience-share-slide
作为苹果公司推出的iOS和OS X应用程序编写语言, Swift 已经走过了一年的路程。因其安全的编程模式以及一些新独特的功能,Swift语言受到了苹果应用开发人员的关注。但是,究竟这门新的编程语言使用感受如何呢?在苹果全球开发者大会(WWDC 2015)召开之前, SlideShare移动应用 的软件开发工程师 Kyle Sherman分享了自己的一些心得体会 。
在Swift发布以后,SlideShare团队在第一时间就开始研究这门新的语言,并在4个月后发布了SlideShare的1.0.0版本。 当时,这是苹果商店中少数几个使用Swift开发的软件之一。目前,SlideShare已经历经11次升级,到了1.6版本。首先,Kyle说明了 SlideShare团队使用Swift的原因。简单而言,使用Swift是因为其与Objective-C之间良好的互操作性、独特的语法特性以及安全 的编程模式。尤其是良好的互操作性保证了使用由Objective-C编写的LinkedIn框架以及一些开源的第三方源代码的便捷性。
此外,Swift与 Ruby 或者 Python 这样的脚本语言语法类似,保证了SlideShare团队可以迅速上手。而且,作为一个升级如此频繁的软件的开发人员,kyle表示Swift语言的迅速变化完全不是问题。因此, SlideShare的工程经理Francisco Meza表示 使用Swift带来了诸多好处。除了自定义的一个子类、一些开源的库、LinkdedIn内部的开发库以及一个内部的Core Data接口等,SlideShare绝大部分代码都采用了Swift进行编写。
接下来,Kyle详细讲述了Swift的诸多优点。在与Objective-C的互操作性方面,Swift用户在桥接的位置添加一个头文件就可满 足大部分情况的需求。只是在使用NSDictionary以及C或者Objective-C创建的枚举时,用户需要特别注意。至于Swift的语法与特性 方面。相比于Objective-C或者C++,Swift去掉了一些不方便的语法约束。例如,在Swift中存在一个与C/Objective-C中的 block功能很像的概念——closure。但是,closure可以省略调用函数时的类型声明以及return的书写。这样,代码在保证易读的同时将 会更加灵活和自然。
另外,Swift中的泛型代码可以让开发人员定义适用于任何类型的、灵活且可重用的函数和类型。目前,许多 Swift 标准库都采用泛型代码来构建。最后,作为Swift的一个重要特性,运算符重载允许用户对现有的作用在特定的结构体和类上的操作符功能进行修改。虽然 SlideShare中还并没有用到运算符重载,但Kyle表示早在使用Objective-C的时候,他就有使用该特性的需求。
Swift在安全方面所做的加强体现在以下几个方面。
- Swift的可选类型会进行编译检查(如nil检测等),防止一些常见的运行时错误。
- Swift的条件语句中循环/判断条件不需要括号,但循环/判断体(body)必需括号。这一特性可以有效的减少条件语句中因为语句所属层次错误引起的bug。
- Swift初始化包括了很多过程。其中,两段式构造过程的使用让构造过程更安全,同时在整个类层级结构中给予了每个类完全的灵活性。而且,Swift 编译器会执行四种有效的安全检查,以确保两段式构造过程能顺利完成。
- Switch语句中每一个可能的值都必须要有一个case分支与之对应。而且,当匹配的 case 分支中的代码执行完毕后,程序会直接终止switch语句。
- Swift不支持隐式类型转换(Implicitly casting)。强制类型转换使用is和as操作符实现。在as操作符后加一个“?”可以有效避免nil引起的程序崩溃。
- Swift中支持public、private、internal以及final等关键字,可以控制访问方法或函数的权限。
当然,除了这些优点,SlideShare团队也发现了Swift的一些缺点。这包括从单行表达式闭包中隐式返回结果可能会引起编译错误、类中的函数无法 返回该类型的数据和函数/方法中的参数命名不清晰等。而且,Swift各个版本中也存在一些问题,诸如编译时间较长且受CPU影响明显、当 SourceKit崩溃时语法高亮也会失效、实时语法检查有一定的延迟、 Xcode 升级时代码也要相应的更新、代码莫名的无法编译或引起IDE/计算机崩溃。
不过,随着Swift版本的升级,这些问题大部分都得到了一定程度的改善。最重要的是,Kyle他们在SlideShare开发过程中没有遇到Swift语言本身引起的问题。