Swift是花拳绣腿吗? - 谈谈开发语言与程序员的职业发展
随着 WWDC 2015的举行,Swift 2.0面世,不仅带来了更多的新特性,更被苹果寄予厚望,有可能代替Objective-C成为iOS平台的标准开发语言。那么Swift能否替代 Objective-C成为新的王者?现有的项目是否需要迁移?我们是否应该马上开始学习Swift呢?在本问中,笔者将从语法特性,学习成本,代码效 率,生态环境4个方面入手,对Swift和其他现代语言进行分析、对比,共同探讨App开发趋势和职业发展前景。
首先我们考察一下 Swift究竟是一个什么样的变成语言。在2014年苹果的WWDC(世界开发者大会)上,Swift首次亮相。苹果号称Swift有3大特性:
- 安全( SAFE)
- 现代(MODERN)
- 强大(POWER)
安全特性中首先介绍的是变量和常量的类型安全:
例如在下面的代码中, Swift用关键字let声明常量,关键字var声明变量。
在声明时可以指定常量和变量的类型,也可以不指定类型,而是直接赋值。 Swift会通过所赋值的类型自动将定义变量的类型。
如果声明时不进行赋值,那么每个类型的变量都有自己的默认值。
例如 Double类型的变量,默认值是0。这点与Objective-C、C++和C语言不同,不对变量赋值的话,那么变量的默认值是一个随机数。如果不注意这点,则很容易由此导致Bug的产生。使用Swift语言则可以避免这种情况发生,所以说Swift是类型安全的。
另一个安全特性是在流程控制方面。例如下面代码中 switch语句有2个case语句。分别代表legCount为0和为1至13奇数的情况。然而显然除了这两种情况之外,legCount还可能是其他的值,比如:2或15等等。
Swift的语法规定,如果 case语句不能覆盖所有可能的情况,则必须加default语句来处理其他情况。否则编译不能通过。
这样可以避免由于程序员疏忽,流程没有被 switch-case经过处理,而引起的逻辑错误。
我们可以看到 Swift中的安全特性确实有助于新手减少Bug和逻辑错误。但是类似于“变量声明时就有初始值”的特性在JavaScript,C#等多种现代语言中早已实现了。
在功能强大方面,有一个特性中是对字符串操作的简化,在下面的代码中, Swfit可以用\(a)的形式,代替C语言中对字符串format操作。大大简化了代码,增加了程序的可读性。
无独有偶,在 WWDC2015中,苹果在新版的Safari和WebKit中增加了一个针对JavaScript的新特性。这个特性可以使用${变量}的符号,代替传统的使用“+”对字符串进行拼接的操作。
在项目实践中,类似的字符串拼接应用较多的是日志操作。一般都已经封装成为组件了。所以,虽然这种语法可以简化代码,但对于工程的影响不大。
另一个与功能强大相关的特性是对 Unicode的支持。
例如下面的代码中可以直接使用苹果的 emoji图标写程序。每一个小老鼠的图标可以作为一个字符(character)处理。
网上还有网友利用 Swift的这个特性写了一个诺亚方舟的故事。
另一个强大的功能是 For-in语句的增强。
比如在 For-in语句中使用0…4表示循环时取[0,4]的闭区间内整数值。
还可以在 For-in中使用“元组”遍历Dictionary。
另外用“ n…m”的形式表示[n,m]闭区间的语法也可以应用在switch-case语句中:
以上就是苹果 WWDC2014中对Swift功能强大方面的一些介绍。然而,从上面的例子可以看出,这些新特性更像是一些语法糖。语法糖在 维基百科 上的定义如下:
语法糖( Syntactic sugar),也译为糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
维基百科上除了有语法糖,还有“语法盐”和“语法糖精” 2个概念。分别代表特别难用的语法,和看似很好用但实际有害的语法。 比如在 Swift beta版中,在for-in语句中可以使用“n..m”语法,表示从n开始,循环m次。例如:
但是在正式版中,这种写法被取消了。因为“ n..m”和“n…m”这两种写法太相似了,如果都保留就会引起混淆,降低程序的可读性,成为“语法盐”或者“语法糖精”了。