Swift 2 有哪些新特性[译]

在WWDC我们发现Swift团队没有浪费时间在无谓的地方,而是致力于改善Swift 2。

我们将会为你编写和录制很多关于Swift 2的教程,但在此期间我想强调Swift最令人兴奋的改变,为你可以在秋天迁移到Swift 2做准备。

错误处理

正如Ray在WWDC 2015 Initial Impressions文章中提及,错误处理已经在Swift 2改进了。我们已经迁移到新的系统就像异常处理,而不是NSError对象和双指针。

你可能对以下代码比较熟悉:

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

一般在Cocoa,你传入一个NSError对象的引用(一个inout参数在Swift),然后方法会赋值给错误变量。但问题是你可以传入一个nil到这里来完全忽略这个错误;或者,你可以传入NSError但从不检查它。

Swift 2 为错误检查添加额外保护层。你可以使用throws关键字来指定那个函数和方法能够抛出一个错误。然后当你调用某样东西时,可以用do, trycatch多个关键字来捕捉和处理错误。

// 1
enum DrinkError: ErrorType {
  case NoBeerRemainingError
}
 
// 2
func drinkWithError() throws {
  if beer.isAvailable() {
    // party!
  } else {
    // 3
    throw DrinkError.NoBeerRemainingError
  }
}
 
func tryToDrink() {
  // 4
  do {
    try drinkWithError()
  } catch {
    print("Could not drink beer! :[")
    return
  }
}

这里有几样东西需要强调的:

  1. 为了创建一个错误可以抛出,只是创建一个继承ErrorTypeenum
  2. 你需要使用throws关键字来标志任何函数可以抛出一个错误。
  3. 这里抛出一个错误,它将会在section 4中被捕捉。
  4. 你在一个do块中包含任何可以抛出一个错误的代码,而不是其他语言类似的try块中。然后,你添加一个try关键字到函数被调用的前面,而且这个函数能够抛出一个错误。

新语法是非常简洁和易读。任何API当前使用NSError以后都会使用这种错误处理方式。

绑定

在Swift 1.2,我们失去了金字塔的厄运和能够在一行代码测试多个绑定的optionals:

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

这样勉强能够工作,但对于有些人需要缩进那个嵌套着很多optionals才能访问的值的“首选”的代码路径是一个问题。这意味着你需要深入查看缩进主线部分的代码块,而错误条件却在外面。

如果有些方式来检查一些没有值的optionals,然后早点退出。这正是Swift 2提供的guard语句:

guard let pants = pants, frog = frog else {
  // sorry, no frog pants here :[
  return
}
 
// at this point, frog and pants are both unwrapped and bound!

使用guard意味着你可以执行optional binding (或其他操作)和如果条件失败就提供一个代码块在else运行。然后,你可以继续执行。在这种情况下,optionals frogpants在作用域内被unwrap。

使用guard指定某种你希望得到状态而不是检查错误情况之后,使代码更加简洁。

注意: 如果你仍然不明白为什么使用guard语句比if-else语句更加有用,请查看Swift团队Eric Cerney‘s postSwift guard statement

协议扩展

面向对象编程?函数式编程?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)")

注意Printable协议现在被命名为CustomStringConvertible,而大多数的Foundation对象都遵循Printable协议。有了协议扩展之,你可以用自定义功能来扩展系统。相比于向很多类、结构体和枚举添加少量的自定义代码,你可以编写一个通用实现,然后应用到不同的数据类型。

Swift团队已经忙着做这个了 - 如果你在Swift已经使用mapfilter,你可能也认为以方法的方式比全局函数来使用它们更好。多亏了强大的协议扩展,已经有一些新的方法添加到集合类型,例如:mapfilterindexOf和更多!

et 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) // returns 2

多亏了协议一致性,你的Swift 2代码会变得更加简洁和易读。在Swift 1版本,你需要查看调用函数内部来理解它的工作原理;在Swfit 2版本,函数链会变得清晰。

如果你打算使用面向协议编程 - 请查看WWDC session on this topic和留意这个网站的教程和文章。

汇总

在WWDC大会中发布很多东西,所以我想强调几样重要的东西:

  • Objective-C 泛型 - Apple已经开始标注所有的Objective-C代码以便Swift类型能够获取正确类型的optional。使用Objective-C泛型也能正常工作,这样给Swift开发者更好的类型提示。如果你希望出现一些UITouch对象或字符串数组,那就会出现你想要的而不是一些AnyObjects

  • 重命名 语法 - println已经离开我们一年了;现在它是普通旧的print,现在它有第二个参数的默认值设置为true来决定是否换行。do关键字主要用来错误处理,do-while循环现在是使用repeat-while。类似地,有很多协议名都改变了,例如:Printable改为CustomStringConvertible

  • Migrator - 有很多小的语法改变,你怎样使得你代码变得最新?Swift 1-to-2 migrator会将代码变成最新的标准和改变语法。这个migrator智能到能够更新你的代码使用新的错误处理,和更新块注释到新的格式风格!

  • 开源! - 对码农有一个重大消息就是在秋天发布Swift 2的时候,Swift将会开源!这意味着不仅可以使用它来iOS开发,更重要的是学习它的源代码。不仅如此,这将是很好的机会来深入源代码,甚至为项目贡献代码,然后在swift编译器提交历史上留下你的名字。

下一步

这只是所有发布特性中的一些简单示例;想了解更多,请查看WWDC session videos和已更新的Swift Programming Language book

如果还有一些人记得在Swift第一个beta版和发布的1.0之间有很多改变,那么将来肯定会有更多地特性出现。我们团队将会持续关注所有的更新,深入挖掘令人兴奋的改变,所以请密切留意教程,书籍和视频。

Swift 2哪部分最令你兴奋?哪部分你想我们第一时间报道?在下面评论让我们知道!

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

推荐阅读更多精彩内容

  • 更多优秀译文请关注我们的微信公众号:learnSwift 原文链接:Friday Q&A 2015-06-19: ...
    梁杰_numbbbbb阅读 4,933评论 3 34
  • Swift 介绍 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 ...
    大L君阅读 3,176评论 3 25
  • 基础部分(The Basics) 当推断浮点数的类型时,Swift 总是会选择Double而不是Float。 结合...
    gamper阅读 1,263评论 0 7
  • 一直没有时间好好看一下swift,最近复习了一遍语法,这里记录swift学习过程中遇到的一些问题和要点,和Obje...
    bomo阅读 2,332评论 0 25
  • 星期一早上,恐怕是医院最繁忙拥挤的时段,我和晓梅理性的选择特需门诊就诊。友谊医院特需门诊与的门诊大楼一路之隔,是另...
    小白大亮阅读 437评论 0 0