Swift 2 有哪些新特性

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

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

错误处理

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

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

Objective-C

1

2

3

4

if drinkWithError(nil) {

print("Could not drink beer! :[")

return

}

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

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

Objective-C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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

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

绑定

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

Objective-C

1

2

3

if let pants = pants, frog = frog {

// good stuff here!

}

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

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

Objective-C

1

2

3

4

5

6

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 frog和pants在作用域内被unwrap。

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

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

协议扩展

面向对象编程?函数式编程?Swift其实还是一种面向协议的编程语言!

在Swift 1,协议就像接口一样可以指定一些属性和方法,然后类,结构体或枚举会遵循它。

现在在Swift 2,你可以扩展协议和给属性和方法添加默认实现。你之前已经可以在类或结构体添加新的方法到String或Array,但现在你可以添加这些到协议,这让你更加广泛地应用。

Objective-C

1

2

3

4

5

6

7

8

9

10

11

12

13

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已经使用map或filter,你可能也认为以方法的方式比全局函数来使用它们更好。多亏了强大的协议扩展,已经有一些新的方法添加到集合类型,例如:map,filter,indexOf和更多!

Objective-C

1

2

3

4

5

6

7

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哪部分最令你兴奋?哪部分你想我们第一时间报道?在下面评论让我们知道!

时间: 2024-10-29 19:12:18

Swift 2 有哪些新特性的相关文章

Swift 3 中的新特性

原文:What's New in Swift 3? 作者:Ben Morrow 译者:kmyhy Swift 3 将在下半年退出,对于 Swift 程序员来说,它带来了许多改变. 如果你没有密切关注 Swift Evolution 项目,那么在将代码迁移到 Swift 3 时,你可能不知道它到底有什么改变,以及它会对你的代码带来什么影响.那么你可能需要读一下这篇文章了. 通过本文,我将重点介绍 Swift 3 中的重大改变,这些改变对你的代码有深刻影响.让我们开始吧! 开始 目前,Swift 3

最全的 Swift 4 新特性解析

转自: http://www.jianshu.com/p/f35514ae9c1a WWDC 2017 带来了很多惊喜.Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,很多强大的新特性非常值得我们期待在正式项目中去使用它.因为 Swift 4 是开源的,如果你关注 swift-evolution 这个项目的话,就应该已经提前了解到它的新特性了.本文参考了 WWDC 2017 以及各种资料,从语法.字符串.标准库.构建过程等方面,把 Swift 4 的这些新特性一一列举出来做介绍

iOS开发——新特性篇&swift新特性(__nullable和__nonnull)

swift新特性(__nullable和__nonnull) 最近在看老师写代码的时候经常遇到两个陌生的关键字,但是当我在我的电脑上敲得时候就是敲不出,后来才知道这是为了swift与OC混编的时候产生的一个新特性,就很认真的研究了一下. 在swift中,可以使用!和?来表示一个对象是optional的还是non-optional,如view?和view!.而在Objective-C中则没有这一区分,view即可表示这个对象是optional,也可表示是non-optioanl. 这样就会造成一个

[转]Swift 2.0初探:值得注意的新特性

转自http://www.cocoachina.com/swift/20150623/12231.html 转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引入了很多新的特性,以帮助开发者能更快,更简单的构建应用.我在这里也说道说道Swift 2.0中值得大家注意的新特性. guard语句 guard语句和if语

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

转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引入了很多新的特性,以帮助开发者能更快,更简单的构建应用.我在这里也说道说道Swift 2.0中值得大家注意的新特性. guard语句 guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么.但与if语句不同的是,guard语句只会

Swift 函数新特性

特性一:函数可以穿出不固定的同一种类型的参数(参数的个数不固定) example: “func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum}sumOf()sumOf(42, 597, 12) 特性二:返回元祖类型数据(元祖:是一种多元化的数据) example: “func calculateStatistics(scores: [Int]) ->

Swift 3.1 的一些新特性

Apple终于发布了Xcode 8.3以及Swift 3.1.如果你没时间仔细通读一遍release note,至少,Swift 3.1中的一些新特性还是值得了解的,为此,我们特别制作了一个免费的内容系列.当然,Swift 3.1和Swift 3在源代码级别是兼容的,因此,如果你的项目已经更新到了Swift 3,这次更新应该不会给你带来太多麻烦.但是,Xcode 8.3去掉了对Swift 2.3的支持,所以,如果你还停留在更早版本的Swift上,就还是谨慎更新的为好. 接下来,我们就简单介绍下这

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

Swift 2.0新特性 转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引入了很多新的特性,以帮助开发者能更快,更简单的构建应用.我在这里也说道说道Swift 2.0中值得大家注意的新特性. guard语句 guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么.但与if语句不

Swift 3 新特性

原文:What's New in Swift 3? ,作者:Ben Morrow,译者:kmyhy Swift 3将于今年下半年推出,为Swift开发者们带来了很多核心代码的改变.如果你没有关注过 Swift Evolution 项目,你可能会好奇Swift 3中有什么改变,它会对你的代码带来什么影响,以及何时可以将代码移植到Swift 3.本文就将为你答疑解惑! 本文中,我将重点介绍 Swift 3 中的重大改变,以及这些改变对你的代码的深刻影响.让我们开始吧! 开始 目前,Swift 3 预