【编者按】2015年6月,一年一度的苹果 WWDC 大会如期而至,在大会上苹果发布了 Swift 2.0,引入了不少新的特性,以帮助开发者更快、更简单地构建应用。本篇文章做者是 Maxime defauw ,本文中 Maxime 向你们简要介绍 Swift 2.0 中值得注意的新特性。本文系 OneAPM 工程师编译整理。html
一年前,苹果推出了面向 iOS 和 OS X 的全新编程语言—— Swift。当听到它发布的时候,像千千万万 iOS 开发者那样,笔者的心里激动无比。正如宣传所说的那样,做为一门快速、安全的编程语言,Swift 已经成长为最流行的编程语言之一。一年以后,苹果不负众望,在2015年的 WWDC 会议中推出了 Swift 2.0。做者有幸去了现场,因此在这里向你们介绍一下 Swift 2.0 的新特性。编程
「今年,咱们将借助 Swift 2.0 乘风破浪。咱们认为 Swift 即将成为最大的编程语言,而且成为下个二十年最不可或缺的应用和系统编程语言。任何人在任何地方都能使用 Swift 」,苹果公司软件工程副总裁 Craig Federighi 说道。swift
在 WWDC 大会上,苹果测量了分贝的新功能普及性。会议中两次最大的掌声,一次是苹果宣布 Xcode 7 支持 UI 测试,另外一次则是 Swift 的开源。若是你错过 WWDC 的主题演讲,或者最近生活得压力山大,那么请你再确认一下,你没有看错:Swift 真的开源了。这但是件大事!下半年,苹果还将公开发布在 OSI 标准许可下的 Swift 的源代码,包括编译器和标准库。苹果也将开放 Linux 的源代码端口,开发者将可以促进语言的发展,并在 Linux 上编写 Swift 程序。由此看出,苹果鼓励开发者进一步推进 Swift 的发展。安全
随着这一使人振奋的消息的发布,Swift 2.0 涵盖了更多新的功能,如升级的错误处理、协议扩展和可用性检查。下面咱们就来看看这些新特性。app
程序总会出错。当函数出现问题时,若是能找出哪里出错,便能理解为何会出现异常。Swift 1.0 版本缺少有效的错误处理机制。在 Swift 2.0 中,开发者能够利用 try / throw / catch 关键字,创建异常处理模式。编程语言
假设你正在加入汽车引擎模型。引擎可能因为某些缘由致使失败:ide
没油;函数
漏油;学习
低电量。测试
在 Swift 中,错误能够看作符合 ErrorType 协议的类型值。在这种状况下,你能够建立立一个符合 ErrorType 的枚举模型来表示错误情形:
enum CarEngineErrors: ErrorType { case NoFuel case OilLeak case LowBattery }
构造一个能够抛出异常的函数,在声明中使用 throws 关键字,以下例所示:
func checkEngine() throws { }
函数中抛出错误,你可使用 throw 声明。下例代码演示了如何对引擎错误进行简单检查:
let fuelReserve = 20.0 let oilOk = true let batteryReserve = 0.0 func checkEngine() throws { guard fuelReserve > 0.0 else { throw CarEngineErrors.NoFuel } guard oilOk else { throw CarEngineErrors.OilLeak } guard batteryReserve > 0.0 else { throw CarEngineErrors.LowBattery } }
guard 关键词是 Swift 2.0 为了加强控制流首次引用的。当执行到 guard 语句时,首先会检查条件语句。若是条件为 false,则 else 部分会被执行。以上代码中,若是没有条件符合,函数将会抛出异常。
为了调用抛出函数,须要把 try 关键字放在函数调用以前。
func startEngine() { try checkEngine() }
若是在 Playgrounds 中写入以上代码,在处理异常以前已经出现错误。Swift 里的错误处理机制,须要使用 do-catch 语句来抓取异常并进行恰当处理。
下面的函数指定了捕获异常后的响应:
func startEngine() { do { try checkEngine() print("Engine started", appendNewline: true) } catch CarEngineErrors.NoFuel { print("No Fuel!") } catch CarEngineErrors.OilLeak { print("Oil Leak!") } catch CarEngineErrors.LowBattery { print("Low Battery!") } catch { // Default print("Unknown reason!") } }
每一个 catch 从句都匹配特定的错误,而且指定相关错误的响应机制。在上面的例子中,batteryReserve 变量被置为0,这种状况下调用 startEngine()将会抛出 .LowBattery 异常。
假如把 batteryReserve 重置为 1.0,这样就没有异常抛出,窗口打印「Engine started」的提示信息。
相似于 switch 语句,Swift 2 的错误处理机制是完备的,你须要考虑到全部可能的错误状况。因此咱们须要包含一个不指定类型的 catch 从句。
若是须要了解更多 Swift 的错误处理机制,推荐你们参考 Apple Documentation。
在做者写这篇介绍时,他注意到 println()函数的缺席。在 Swift 2.0 中,咱们只需 print()函数便能打印到输出窗口。苹果公司将 println()和 print()函数合二为一。若是你想隔行输出,能够将 appendNewline 参数设为 true。以下面代码所示:
print("Engine started", appendNewline: true)
在老版 Swift 中,你可使用扩展为现有的类、结构或枚举添加新功能。Swift 2.0 容许开发者应用扩展到协议类型。随着协议的扩展,你能够经过添加一个特定协议,为全部类添加函数或属性,也便于扩展协议的功能。
以下例所示,建立一个新协议并命名为 Awesome。该协议能够由任何能返回特定对象的 awesomeness 指数百分比的类型来实现。
protocol Awesome { func awesomenessPercentage() -> Float }
如今声明两个遵照新协议的类。每一个类都实现了 Awesome 协议的指定方法:
class Dog: Awesome { var age: Int! func awesomenessPercentage() -> Float { return 0.85 } } class Cat: Awesome { var age: Int! func awesomenessPercentage() -> Float { return 0.45 } } let dog = Dog() dog.awesomenessPercentage() let cat = Cat() cat.awesomenessPercentage()
在 Playground 中初始化该类并调用 awesomenessPercentage()方法,会看到以下输出:
若是你想补充一个 awesomenessIndex 属性来扩展 Awesom 协议,那么可使用 awesomenessPercentage 方法的结果来计算 awesomeness 值。编码以下:
extension Awesome { var awesomenessIndex: Int { get { return Int(awesomenessPercentage() * 100) } } }
在协议中建立扩展,全部遵循 Awesome 协议的类都能访问 awesomenessIndex 属性。
的确很炫酷,是吧?
开发者都知道,构建应用须要时时与不一样 iOS 版本作斗争。你老是但愿使用最新版的 API,但有时应用旧版本的 iOS 上运行时容易出错,这可能会致使 Bug。在 Swift 2.0 以前,没有标准方式来进行可用性检查。好比:NSURLQueryItem 类在 iOS 8 上才可用,若是在 iOS 之前的版本中使用则会出错,甚至会致使应用崩溃。为了不这种错误,你能够按照如下代码执行可用性检查:
if NSClassFromString("NSURLQueryItem") != nil { // iOS 8 or up } else{ // Earlier iOS versions }
这是检查类是否存在的一种方式。从 Swift 2 开始支持 API 在不一样版本下的可用性检查。你能够简单定义一个可用性条件,因此相应的代码块只能在特定的 iOS 版本下执行,举例以下:
if #available(iOS 8, *) { // iOS 8 or up let queryItem = NSURLQueryItem() } else { // Earlier iOS versions }
经典的 do-while 循环现更名为 repeat-while,请参考下例:
var i = 0 repeat { i++ print(i) } while i < 10
但愿你们能喜欢这篇关于 Swift 2.0 的介绍。还有不少内容没有涵盖到,好比 Markdown 格式的注释等。更多详情能够参考 this WWDC video。写到这儿,不少公司还在使用 Objective-C 做为构建 iOS 应用的主要编程语言,极可能你也是。但做者仍坚信 Swift 的发展前景更为广阔。事实上,2015年 WWDC上全部重要会议都在使用 Swift,若是你尚未学习 Swift,是时候采起行动了!
你能够在此下载本篇文章的 Playground 文件。确保使用 Xcode 7运行的代码,这是惟一支持 Swift 2.0 的 Xcode 版本。Xcode 7 目前仍处于测试阶段。你能够从苹果官网上下载。