Swift 2.0 到底「新」在哪?(swift系统)

网友投稿 594 2022-09-12

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Swift 2.0 到底「新」在哪?(swift系统)

「今年,我们将借助 Swift 2.0 乘风破浪。我们认为 Swift 即将成为最大的编程语言,并且成为下个二十年最不可或缺的应用和系统编程语言。任何人在任何地方都能使用 Swift 」,苹果公司软件工程副总裁 Craig Federighi 说道。

在 WWDC 大会上,苹果测量了分贝的新功能普及性。会议中两次最大的掌声,一次是苹果宣布 Xcode 7 支持 UI 测试,另一次则是 Swift 的开源。如果你错过 WWDC 的主题演讲,或者最近生活得压力山大,那么请你再确认一下,你没有看错:Swift 真的开源了。这可是件大事!下半年,苹果还将公开发布在 OSI 标准许可下的 Swift 的源代码,包括编译器和标准库。苹果也将开放 Linux 的源代码端口,开发者将能够促进语言的发展,并在 Linux 上编写 Swift 程序。由此看出,苹果鼓励开发者进一步推动 Swift 的发展。

随着这一令人振奋的消息的发布,Swift 2.0 涵盖了更多新的功能,如升级的错误处理、协议扩展和可用性检查。下面我们就来看看这些新特性。

错误处理

程序总会出错。当函数出现问题时,如果能找出哪里出错,便能理解为什么会出现异常。Swift 1.0 版本缺乏有效的错误处理机制。在 Swift 2.0 中,开发者可以利用 try / throw / catch 关键字,建立异常处理模式。

假设你正在加入汽车引擎模型。引擎可能由于某些原因导致失败:

没油;漏油;低电量。

在 Swift 中,错误可以看做符合 ErrorType 协议的类型值。在这种情况下,你可以创建立一个符合 ErrorType 的枚举模型来表示错误情形:

enum CarEngineErrors: ErrorType {     case NoFuel    case OilLeak    case LowBattery}

func checkEngine() throws { }

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()函数缺席

print("Engine started", appendNewline: true)

协议扩展

在老版 Swift 中,你可以使用扩展为现有的类、结构或枚举添加新功能。Swift 2.0 允许开发者应用扩展到协议类型。随着协议的扩展,你可以通过添加一个特定协议,为所有类添加函数或属性,也便于扩展协议的功能。

如下例所示,创建一个新协议并命名为 Awesome。该协议可以由任何能返回特定对象的 awesomeness 指数百分比的类型来实现。

protocol Awesome {     func awesomenessPercentage() -> Float}

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

经典的 do-while 循环现改名为 repeat-while,请参考下例:

var i = 0 repeat {     i++    print(i)} while i < 10

总结

上一篇:斯坦福大学 CEO 组织神秘到访(斯坦福大学在美国哪个州)
下一篇:DevOps:怎么实现源代码注释和系统文档的自动化更新?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~