时间:2016-12-16来源:本站原创作者:佚名

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿、参与内容翻译工作,或寻求近匠报道,请发送邮件至tangxy#csdn.net(请把#改成

)。

随着WWDC的举行,Swift2.0面世,不仅带来了更多的新特性,更被苹果寄予厚望,有可能代替Objective-C成为iOS平台的标准开发语言。那么Swift能否替代Objective-C成为新的王者?现有的项目是否需要迁移?我们是否应该马上开始学习Swift呢?在本问中,笔者将从语法特性,学习成本,代码效率,生态环境4个方面入手,对Swift和其他现代语言进行分析、对比,共同探讨App开发趋势和职业发展前景。

首先我们考察一下Swift究竟是一个什么样的变成语言。在年苹果的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操作。大大简化了代码,增加了程序的可读性。

无独有偶,在WWDC中,苹果在新版的Safari和WebKit中增加了一个针对JavaScript的新特性。这个特性可以使用${变量}的符号,代替传统的使用“+”对字符串进行拼接的操作。

在项目实践中,类似的字符串拼接应用较多的是日志操作。一般都已经封装成为组件了。所以,虽然这种语法可以简化代码,但对于工程的影响不大。

另一个与功能强大相关的特性是对Unicode的支持。

例如下面的代码中可以直接使用苹果的emoji图标写程序。每一个小老鼠的图标可以作为一个字符(character)处理。

网上还有网友利用Swift的这个特性写了一个诺亚方舟的故事。

另一个强大的功能是For-in语句的增强。

比如在For-in语句中使用0…4表示循环时取[0,4]的闭区间内整数值。

还可以在For-in中使用“元组”遍历Dictionary。

另外用“n…m”的形式表示[n,m]闭区间的语法也可以应用在switch-case语句中:

以上就是苹果WWDC中对Swift功能强大方面的一些介绍。然而,从上面的例子可以看出,这些新特性更像是一些语法糖。语法糖在维基百科上的定义如下:

语法糖(Syntacticsugar),也译为糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

维基百科上除了有语法糖,还有“语法盐”和“语法糖精”2个概念。分别代表特别难用的语法,和看似很好用但实际有害的语法。比如在Swiftbeta版中,在for-in语句中可以使用“n..m”语法,表示从n开始,循环m次。例如:

但是在正式版中,这种写法被取消了。因为“n..m”和“n…m”这两种写法太相似了,如果都保留就会引起混淆,降低程序的可读性,成为“语法盐”或者“语法糖精”了。

现在评价Swift中的新语法是语法糖还是语法盐还为时尚早,需要时间和市场的检验。

接下来考察一下Swift中Modern的特性。

首先是闭包。在下面的代码中,repeat函数可以接受一个闭包类型的task参数。在调用repeat函数时,传入的第二个参数是一个函数体,其中包含了一行打印语句。

那么什么是闭包呢?

闭包有以下3个特点:

匿名函数(方法);

可以被执行;

可以被作为参数传递。

提到闭包,想必很多人都会想到JavaScript。我们就来对比一下JavaScript的闭包。

我们可以看到在上述代码中,sayAlert是闭包,也满足上述3个特点。

其实满足上述3个特点的语法还有很多,只是名字不一样而已。比如Java和C#中的Lamda表达式:

这是一段C#代码,delegate关键字用于定义一个函数签名。比如用del为名称,定义了一个参数int返回int的函数。接下来用Lamada表达式定义了函数体为“x=x*x”表示返回参数x的平方。

此时myDelegate可以被调用和传递,因此就成为了一个闭包。

更广义的说,C中的“指向函数的指针”也满足上述的3个条件。

因此,闭包虽然是现代语言的特性,但是很多语言都支持,并不能算一个很新颖的特性。

另一个现代的特性是“泛型”。

在Swift中使用泛型很方便,语法和Java、C#、C++也很类似。

不过使用Objective-C的朋友也有福了,在即将发布的XCode7中,Objective-C也支持泛型了。

因此我们大可不必因为泛型而转向Swift。

Swift中还有一个特性是“nullable”的变量类型,也叫可选(Optional)变量。

这是一个很方便的特性。比如一个返回值为int的函数,可以通过返回nil来表示函数出错的情况。而不需要使用NSError,也不需要通过返回某些特殊int值来表示错误,比如“-1”或“-IntMax”。

不过类似的语法在10年前的C#2.0中就出现了。

以上是微软







































白癜风治疗那家医院好
北京白斑病医院

转载请注明原文网址:http://www.helimiaopu.com/hjpz/3719.html

------分隔线----------------------------