苹果Swift:易于入门的新型表达方式
【IT168 技术】如何才能证明企业自身的雄厚财力?当耀眼的私人飞机与闪亮的总部大楼不足以说明问题的时候,新型编程语言开始肩负起这一“历史重任”。时至今日,苹果已经继微软(C#)、Sun(Java)、以及谷歌(Dart与Go)之后走上了同一条道路,为我们带来Swift——一款采用类C型语法、旨在帮助编程人员轻松为Mac及iPhone开发全新应用程序的编程语言后起之秀。
虽然怎样估量苹果的高傲风格都不为过,但Swift绝不仅仅是那种出于虚荣心而建立、希望像英语一般在全球技术人员中占据统治地位的计算机编程方案项目。苹果的软件堆栈自NeXT归入该公司后一起紧紧围绕在Objective-C这一绝对核心周围,而众多新手在接触之后普遍抱怨其指针、文件(.m与.h皆是如此)以及包含大量标点符号的语法令人头痛不已。
苹果曾于1997年尝试利用“现代语法”对该语言进行更新,但群众用户明确表示拒绝放弃所谓经典语法。而其它项目——例如将Java绑定包添加到Cocoa库当中——则始终没有真正得到坚持与贯彻。时至今日,Objective-C语言已经成为鼓励开发人员为苹果平台编写代码时所面临的最大障碍之一。
好消息是:Swift将成为一份伟大的礼物,足以帮助任何希望摆脱Objective-C这道难关的开发人员。曾经学习过如何利用Java进行汇编计算机科学、怎样通过JavaScript创建Web页面以及如何借助Ruby构建网站的程序员将在Swift当中获得相当贴心的熟悉之感。多文件与继承过程非常平顺,而标点符号也不再在代码表达当中占据主导性地位,这一切显然都可算是Swift的显著优势。除此之外,这款新语言在自动化功能方面也更为丰富,其中包括输入内容自动推断以及引用计数——旨在帮助编译器纠正程序员在开发过程中经常出现的错误。
为什么要推出Swift?
很多人可能不太理解,苹果公司为什么不直接选择一款已经在市场上拥有一定基础的现有语言。JavaScript在Web逐渐占领世界的时代背景下可算一项理想方案,但它并不能提供全部指向字节的低级访问,而这显然将导致系统程序员额外构建更多接口以定义苹果应用的使用体验。无论如何,JavaScript程序员们已经在使用PhoneGap/Cordova等框架。而以Python或者Ruby等语言为代表的其它语言都能与Unix后端顺畅集成,但它们都缺乏与系统软件深入对接的能力。最好的答案可能是充分利用苹果在Cocoa层已经投入的庞大研发资源,而Swift则是在保护过往投入的同时带来现代便利特性的最佳途径。
Swfit程序的基础结构看起来与Java非常相近。代码内容被拆分成类,这些类又由字符段与方法填充而成。其中最具决定性的差异感戴,这些方法以关键字(func)为起首,而返回值则位于方法名称之后而非之前。这些类能够被分配到结构当中,而该结构拥有大量继承自原有机制的面向对象代码内容;此外属性可以利用点语法进行读取。
大家需要掌握的就只有高级路线图与一部分关于声明变量语法的具体知识。就在苹果发布Swift语言的几天之内,利用Swift编写的开源软件已经开始出现在GitHub之上。其中最引人注目的项目包括由Nate Murray编写的“Flappy Bird”复刻版,它只使用了两个主Swift文件与一点点接合代码。如果大家已经拥有自己擅长的OS X或者iOS编程方式,肯定能够快速上手Swift这种新型表达方式。Murray表示,他只用了一天就完成了自己的游戏复刻工作。
Swift修复了一部分最受诟病的Java语法。大家根本不需要浪费输入操作来拼写出每一个变量类型;编译器从一开始就能够自动推断我们打算输入的内容。各位能够享受的显著优势之一在于,编译器可以在无需大量关键字的前提下检查变量类型。如果大家打算将多种变量与字符串接合在一起,Swift提供的一套简单模板能够仅仅通过三次输入将输入变量转换为字符串。这实在堪称一大壮举。
Swift带来的提升还不止于此。Scode现在提供所谓“playground”,大家可以在这里输入代码并直接观看用户手指操作时这些代码的执行效果。这样的沙箱机制让开发人员学习JavaScript与JavaScript API的道路变得更为顺畅而简单。举例来说,谷歌仅仅提供一套“playground”Web页面就成功为其谷歌地图API吸引到了众多开发者拥趸。Xcode的playground在效果上远远超过了谷歌的方案,因为它能够直接将灰色选定部分的代码运行效果显示在右侧区域内,从而帮助大家了解该语言如何执行。我在使用playbround过程中遇到的惟一负面问题是,我曾经遇上过数次崩溃情况而且无法成功重现。请大家相信,我绝对没有犯过那种“除以0”的低级错误。这一次崩溃了,下一次重新执行时却一切正常——实在有点诡异。
纵观Swift带来的全部提升与改进,我发现Swift的规模实在有点吓人。尽管根据Nate Murray在一天之内成功完成“Flappy Bird”复刻来看其使用难度并不高,但该语言另外也有很多不可能在几分钟内掌握的重要细节。我花了很长一段时间希望搞清根据值(struct)进行传输的数据与根据指针(class)传输的数据之间到底有什么不同。弄明白这些差异在C语言编程工作当中就是一大挑战,而对于Swift程序员来说这项任务依然困难、特别是对那些希望能让自己代码获得最佳性能表现的开发者而言更是如此。
优化工作对于某些特定代码类型来说也可能成为令人头痛的实际障碍。举例来说,字符串始终根据值进行传输,也就是说Swift会在每一次函数调用时从左到右对字符串内容进行复制。这种处理方式对于游戏这类以图形元素为基础的程序来说也许并不算什么问题,但像Web服务器与内容管理系统这样的程序从本质上讲则属于连结机制。任何打算从字符串入手的开发人员都需要在编写Swift代码的时候认真考虑这种情况。他们可能最终需要对类当中的字符串值进行打包以防止上述复制过程。
我还指定了其它一些需要深入研究的议题。举例来说,向下转换允许大家利用类型转换运算符(as)将关注对象从类转移到子类身上。这可能会导致问题,因为还有另一种添加问号的类型转换运算符(as?),如果向下转换无法成功、该运算符则会返回“零”值。有一些此类可选功能会由于存在问号或者不存在问号而彻底改变关键字的执行效果。而另一项特性,也就是子脚本,允许大家快速接入某个类并提取出一个特定值。Swift虽然带来了可观的简洁性提升,但却也大大增加了出现表达混淆的潜在可能性。
新增的playground能够在我们输入Swift代码的同时对内容进行评估。大家在左侧输入的代码内容会直接以效果形式显示在右侧区域当中。
一项重大承诺
如果有人告诉大家Swift是一种简单的语言,请绝对不要相信他。尽管对于编写“hello world”或者只有几行代码的简单应用程序来说它足够易用,但从另一个角度看,要编写出具备无数细节并存在细微差异因素的应用则需要我们花费大量时间磨炼自己的水平。熟练的程序员们会乐于将自己的技术实力以及聪明才智运用到自己的软件成果当中,但很多新手肯定会发现这类代码内容很难阅读。这绝不是一种能够轻易掌握的语言,大家千万别被它简单上手的表象给迷惑了。
关于Swift,最需要认真考虑的就是其发展前景。尽管一部分规模相对较小的新语言往往给人一种玩具般的感觉,但Swift却绝对是一项重大承诺。关于Swift开发的第一本指南教程非常优秀,这一方面是因为它拥有超过850页的浩大篇幅。Xcode下载包现在已经达到2.5GB。Swift语言并不是一种使用难度很低但只能应对轻量级开发任务的玩物——它是名符其实的一款完整软件包,设计目的在于为任何技术团队的程序员们提供足以支持重大项目的开发方案。
Swift语言当中还包含大量“钩子”及其它用于同现有Cocoa库进行协作的工具。苹果并不希望重新编写其iOS及OS X堆栈,因此Swift能够与之前的代码轻松对接。整个Swift项目的建立目的在于维持开发者对于这些堆栈的兴趣并帮助有志投向于应用程序开发的朋友能够更轻松地跨过这道门槛。与此同时,大家还可以在自己的iOS或者OS X项目当中尽可能多或者尽可能少地使用Swift代码——具体情况各位可以随性而为。
苹果并没有以强制性手段推动Swift。毫无疑问,很多保守派开发人员会继续坚持使用Objective-C。不过Swift能让原本熟悉其它语言及传统机制的程序员们快速上手这种新的开发途径,拿起Xcode这柄利器马上投入到实际生产当中。单这一项就足以成为苹果公司发展历程上的一大步,而且也很可能带来数量原超过从前的原生iOS与OS X代码。Swift并不打算接管整个世界——它更像是一份专门送给开发者们的大礼。