【编者按】2015年6月,一年一度的苹果 WWDC 大会如期而至,在大会上苹果发布了 Swift 2.0,引入了很多新的特性,以帮助开发者更快、更简单地构建应用。本篇文章作者是 Maxime defauw ,本文中 Maxime 向大家简要介绍 Swift 2.0 中值得注意的新特性。本文系 OneAPM 工程师编译整理。

一年前,苹果推出了面向 iOS 和 OS X 的全新编程语言—— Swift。当听到它发布的时候,像千千万万 iOS 开发者那样,笔者的内心激动无比。正如宣传所说的那样,作为一门快速、安全的编程语言,Swift 已经成长为最流行的编程语言之一。一年之后,苹果不负众望,在2015年的 WWDC 会议中推出了 Swift 2.0。作者有幸去了现场,所以在这里向大家介绍一下 Swift 2.0 的新特性。

「今年,我们将借助 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
}

构造一个可以抛出异常的函数,在声明中使用 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()函数缺席

在作者写这篇介绍时,他注意到 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

经典的 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 目前仍处于测试阶段。你可以从苹果官网上下载。

原文地址:What’s New in Swift 2.0: A Brief Introduction

本文系 OneAPM 工程师编译整理。想阅读更多技术文章,请访问 OneAPM 官方博客

Swift 2.0 到底「新」在哪?的更多相关文章

  1. ASP.NET Core 2.0 MVC「远程」验证

    问题 如何 在ASP.NET Core MVC中使用[Remote]属性来实现模型验证 . 解 在 启动时, 为MVC配置中间件和服务. 添加一个模型. 添加一个控制器. 为jQuery添加一个Raz ...

  2. iOS开发——新特性OC篇&Swift 2.0新特性

    Swift 2.0新特性     转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度 ...

  3. Swift 2.0初探:值得注意的新特性

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...

  4. Swift 2.0初探

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心. 今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引 ...

  5. 洛谷比赛 「EZEC」 Round 4

    洛谷比赛 「EZEC」 Round 4 T1 zrmpaul Loves Array 题目描述 小 Z 有一个下标从 \(1\) 开始并且长度为 \(n\) 的序列,初始时下标为 \(i\) 位置的数 ...

  6. 洛谷 8 月月赛 & 「PMOI」Round · 04

    T1 T166167 「PMOI-4」人赢 题目大意 给一个数列的前两项分别为\(n\)和\(m\) 当\(i\geq3\)时\(a_i = a_{i-1}*a_{i-2}\)的个位 给定\(n\), ...

  7. 《从零开始学Swift》学习笔记(Day 3)——Swift 2.0之后增加的关键字

    Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字 原创文章,欢迎转载.转载请注明:关东升的博客 看了之前的学习笔记知道了什么是关键字,现在提示各位在Swift 2.0之后 ...

  8. 「笔记」数位DP

    目录 写在前面 引入 求解 特判优化 代码 例题 「ZJOI2010」数字计数 「AHOI2009」同类分布 套路题们 「SDOI2014」数数 写在最后 写在前面 19 年前听 zlq 讲课的时候学 ...

  9. React + Node 单页应用「二」OAuth 2.0 授权认证 & GitHub 授权实践

    关于项目 项目地址 预览地址 记录最近做的一个 demo,前端使用 React,用 React Router 实现前端路由,Koa 2 搭建 API Server, 最后通过 Nginx 做请求转发. ...

随机推荐

  1. 动态加载故事storyboard

    第一种方法: ViewControllerB *vcB = [self.storyboard instantiateViewControllerWithIdentifier:@"Name o ...

  2. node.js web开发:EXPRESS 4.x 以上使用session和cookie 的记录

    关于session 和cookie 我搞了2-3天, 发现这个玩意也挺麻烦的. 很多教程都是把这种会话保存在nosql里面,比如mongo,或者redis等等.但是我还是想直接保存在计算机的内存中,比 ...

  3. [转载]--Ubuntu下修改DNS重启也能用的方法

    安装好Ubuntu之后设置了静态IP地址,再重启后就无法解析域名.想重新设置一下DNS,打开/etc/resolv.conf cat /etc/resolv.conf# Dynamic resolv. ...

  4. 小心C语言的定义与声明

    小心C语言的定义与声明 转自360博客 注:为便于说明问题,文中提及的变量和函数都被简化. 一.起源 DBProxy在测试过程中,发现对其执行某步管理操作后,程序有时会崩溃,但不是每次都出现. 二.G ...

  5. SharePoint2013网站添加切换用户登录

    不知道大家发现没,sharepoint2013的网站集下面没有了切换用户登陆这个选项卡,这对于我们有时候要做一些权限性的实验是不太方便的,今天我找到了一个办法解决,又实际应用了一下,感觉不错,特地来和 ...

  6. orcherd 汉化

    点击这里下载汉化包,此汉化包是在是在前人的基础上精心整理修改的,后续汉化版本随时升级更新. Orchard汉化包 下载后解压缩后打开后看到如下文件夹(App_Data.Core.Modules.The ...

  7. Eclipse基金会

    昨天Eclipse基金会庆祝其成立十周年.2004年2月的新闻稿宣布该非盈利组织的正式成立,由包括开发者.消费者和插件提供商在内的各独立团体组成的董事会,为Eclipse的长期发展负责. 基金会成立时 ...

  8. notepad++ erlang开发环境设置

    初学erlang 网上有使用eclipse的,有使用emacs的,尝试了一下, 感觉太麻烦,来试试notepad++吧. 有什么新使用方法会再更新上来,for you for me. 1.语法高亮: ...

  9. sublime3快捷键

    Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函数名等. ...

  10. EF4.1之基础(实现Code First)

    Code First:顾名思义:就是通过代码生成数据库----通过类生成数据库中对应的表: 首先定义两个类(就是建模的过程): public class Order { public int Orde ...