Swift 2.0 新特性

本文翻译自 Ray Wenderlich
原文地址:What's New in Swift 2

swift-new.jpg

在WWDC大会上,我们发现Swift小组为Swift 2的发展做出了很大的努力。

我们最近将会更新大量关于Swift 2的文章和视频教程,不过在这之前,我想先将Swift 2中令人兴奋的更新变化先挑出来唠一唠,以让你能顺利地迁移到这个秋天将会发布的正式版Swift 2中。

Error Handling(错误处理)

就像Ray在WWDC 2015 Initial Impressions这篇文章中提到的,错误处理在Swift 2当中有了很大的更新。对比以前使用的NSError对象,新版的错误处理看起来更像其它语言(吐槽:没错,说的就是你,JAVA)中的异常处理。

你可能对这样的代码很熟悉了:

if drinkWithError(nil) {
    print("Could not drink beer! :[")
    return
}

Cocoa编程中,我们通常传入一个NSError对象的引用(在Swift中是一个inout类型的参数),如果出现了错误,则这个方法会对错误对象进行赋值。然而,问题的关键在于,你完全可以通过传入一个nil参数来忽略这个错误,或者你可以传一个NSError对象进去,但是不对这个错误对象进行任何处理。

Swift 2更进一步加强了错误处理的安全性。我们可以使用throws关键字表示一个方法可能抛出错误。然后我们可以使用dotrycatch这些关键字来对可能抛出错误的方法进行处理:

// 1
enum DrinkError: ErrorType {
    case NoBeerRemainingError
}

// 2
func drinkWithError() throws {
    if beer.isAvailable() {
        // 嗨起来
    } else {
        // 3
        throw DrinkError.NoBeerRemainingError
    }
}

func tryToDrink() {
    // 4
    do {
        try drinkWithError()
    } catch {
        print("Could not drink beer! :[")
        return
    }
}

这里有几个要点:

  1. 要创建一个可以抛出的错误,只要创建一个继承于ErrorType类型的枚举就行了。
  2. 你需要使用throws关键字来标记出可能抛出错误的函数。
  3. 这里抛出了错误,这个错误可以在4中被捕获到
  4. 跟我们所熟悉的某语言(吐槽:还不是JAVA?)不同,这里不是使用try而是用do来包裹可能捕获到错误的代码块。然后,使用try关键字来对可能抛出错误的方法进行调用。

新的语法相当轻量,并且可读性很高。之前系统中所有使用NSError的方法,都会改用这个新的语法,所以在之后我们将会看到很多类似这样的代码。

throw-all-the-things-415x320.jpg

Binding(绑定)

在Swift 1.2当中,我们可以在一行当中同时对多个可选值进行解绑,从而摆脱了所谓的"金字塔的厄运":

if let pants = pants, frog = frog {
    // good stuff here!
}

这很好,但是对于某些强迫症患者来说可能有点难受,因为只要我们对可选值进行绑定就意味着对我们有用的代码都必须写在一个if代码块中,这实在太不爽了(译注:至少对我来说很不爽)。

如果能有种方法,能让我们能检测到某些可选类型是没有值的,这样我们就可以提前结束这个函数。当然有!这就是Swift 2中提供的guard声明的用处所在:

guard let pants = pants, frog = frog else {
    // sorry, no frog pants here :[
    return
}

// 在此后的作用域中,pants和frog都是绑定过并且有值的

使用guard意味着你可以对可选类型进行绑定(或者其它操作,真的),然后在else中提供代码块以处理判断失败的状况。接着,你可以继续往下执行 - 在这种情况下,在整个作用域中,可选类型的frog和pants都已经进行过绑定,并且不再是可选类型了。

这可以让我们的代码更加清楚和简洁,因为guard可以让你在你所期望的状态下专心写代码,而不用再一直对错误进行判断。

附注:如果你还是对为什么使用`guard`声明比使用`if-else`更有用抱有疑惑的话,可以看下Swift开发组成员[Eric Cerney][6]的这篇文章[Swift guard statement][7]。

Protocol Extensions(协议扩展)

面向对象编程?函数式编程?现在对Swift的描述中又要加上重要的一笔:面向协议的编程语言!

在Swift 1当中,协议就是一个定义了一些属性和方法的接口。类、结构体和枚举类型都能遵守这些协议,并实现相应的方法。

现在的Swift 2可以对协议进行扩展,然后为属性和方法提供默认实现。在之前我们就可以对类和结构体进行这样的操作 -- 比如为StringArray增加新方法。然而,可以对协议进行扩展有着更重要的意义。

extension CustomStringConvertible {
  var shoutyDescription: String {
    return "\(self.description.uppercaseString)!!!"
  }
}
 
let greetings = ["Hello", "Hi", "Yo yo yo"]
 
// prints ["Hello", "Hi", "Yo yo yo"]
print("\(greetings.description)")
 
// prints [HELLO, HI, YO YO YO]!!!
print("\(greetings.shoutyDescription)")

注意,被大部分Foundation对象所遵守的Printable协议,现在已经改名为CustomStringConvertible。使用协议扩展,我们可以为系统添加更多的自定义功能。并且相对于为各个不同的类、结构体以及枚举分别添加自定义代码,现在可以编写一个通用的实现,然后让不同的类型都遵守这个协议。

Swift开发团队很早就在为这个功能作出各种努力了 -- 如果你曾经使用过Swift当中的map或者filter,你可能会觉得把他们作为方法使用会比作为全局函数方便很多。感谢协议扩展,Swift当中的集合类型现在拥有了一大波新的方法,比如mapfilterindexOf,等等!

let numbers = [1, 5, 6, 10, 16, 42, 45]

// Swift 1
find(filter(map(numbers { $0 * 2 }), { $0 % 3 == 0 }), 90)

// Swift 2
numbers.map { $0 * 2 }.filter { $0 % 3 == 0 }.indexOf(90) // return 2

使用了新的方法,Swift 2的代码变得更加简洁和可读。对于Swift 1版本的代码,为了理解它的作用,你得前前后后盯着看很久。而Swift 2的版本中的函数调用链让代码简单易懂。

为了体会到面向协议编程更加强大的功能 -- 可以参考WWDC中关于这个主题的视频,同时请关注本站后续将会推出的新教程和文章。

其它变化

在整个大会过程中,苹果还公布了许许多多的新东西,所以下面列出了一些值得关注的亮点:

  • Objective-C泛型 - 苹果很早就在对Objective-C代码进行注释,以使我们在开发Swift的时候能使用正确的类型。这个工作作为Objective-C泛型继续在进行,这可以使Swift开发者获得更加直观的类型提示。如果你期望得到一组UITouch的对象,或者一个String的数组,那么你就可以直接获得,而不是像之前一样只能得到一个AnyObject的集合。
  • 语法重命名 - println函数只陪伴了我们短短的一年。现在我们将使用print进行输出,现在这个方法添加了默认为true第二个参数,用来指定输出是否要进行换行。因为do关键字现在被用于错误处理,现在do-while循环将被替换为repeat-while。类似地,还有许多协议名称的变化,比如Printable变成了CustomStringConvertible
  • 迁移器 - 面对这么多的小变化,我们要怎么对我们的代码进行更新?就让Swfit迁移器来拯救你吧,使用迁移器可以让我们的代码更新到最新的语法。迁移器甚至能自动将代码更新到新的错误处理语法格式,以及新的文档注释格式。
  • 开源!- 对于那些技术宅来说,最重要的新闻当然中Swift将会在这个秋天开源。这意味着,Swift以后将不会仅仅用于iOS开发,同时也说明Swift将会更加值得我们学习。当然,如果你够屌的话,你可以打开Swift的黑盒子,然后对Swift团队进行反馈和贡献,让你的名字留在Swift编译器的历史上。

Where To Go From Here?

这里只是苹果一大票更新中的一小部分。想要获得更加详细的信息,可以参考WWDC大会的视频,以及最新更新的Swift Programming Language一书

如果有人还记得Swift刚推出时,从beta版到1.0版本中间进行的变化和修改,你就会明白,所有的一切才刚刚开始。本站的教程小组将会持续关注Swift最新的变化和更新,并且推出关于这些令人兴奋的更新的一系列文章,以及视频教程。

Swift 2中哪些部分的更新最让你感到激动?你希望我们的教程从哪里开始?可以在下面留言,让我们知道你的需求!

最后再打个小广告:),本人博客地址:Swiftyper

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,613评论 4 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • 第一次到大瀑布,很想知道为什么水花可以飞这么高。
    kebb阅读 85评论 0 0
  • 本人使用的是安装在虚拟机上的Ubuntu自带的vim编辑器。vim有多种模式:在normal模式下文本不可被编辑,...
    朱小维阅读 369评论 0 1
  • 01 嘟嘟年后入园第三天,我发现一件怪事。 每到出门准备上幼儿园时,嘟嘟就一直嘟嚷着:妈妈,我不上幼儿园。然后,只...
    诗怡阅读 378评论 0 2