标签:
在WWDC我们发现Swift团队没有浪费时间在无谓的地方,而是致力于改善Swift 2。
我们将会为你编写和录制很多关于Swift 2的教程,但在此期间我想强调Swift最令人兴奋的改变,为你可以在秋天迁移到Swift 2做准备。
正如Ray在WWDC 2015 Initial Impressions文章中提及,错误处理已经在Swift 2改进了。我们已经迁移到新的系统就像异常处理,而不是NSError对象和双指针。
你可能对以下代码比较熟悉:
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但从不检查它。
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
}
}
|
这里有几样东西需要强调的:
新语法是非常简洁和易读。任何API当前使用NSError以后都会使用这种错误处理方式。
在Swift 1.2,我们失去了金字塔的厄运和能够在一行代码测试多个绑定的optionals:
1
2
3
|
if let pants = pants, frog = frog {
// good stuff here!
}
|
这样勉强能够工作,但对于有些人需要缩进那个嵌套着很多optionals才能访问的值的“首选”的代码路径是一个问题。这意味着你需要深入查看缩进主线部分的代码块,而错误条件却在外面。
如果有些方式来检查一些没有值的optionals,然后早点退出。这正是Swift 2提供的guard语句:
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 post在Swift guard statement。
面向对象编程?函数式编程?Swift其实还是一种面向协议的编程语言!
在Swift 1,协议就像接口一样可以指定一些属性和方法,然后类,结构体或枚举会遵循它。
现在在Swift 2,你可以扩展协议和给属性和方法添加默认实现。你之前已经可以在类或结构体添加新的方法到String或Array,但现在你可以添加这些到协议,这让你更加广泛地应用。
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)")
|
Swift团队已经忙着做这个了 – 如果你在Swift已经使用map或filter,你可能也认为以方法的方式比全局函数来使用它们更好。多亏了强大的协议扩展,已经有一些新的方法添加到集合类型,例如:map,filter,indexOf和更多!
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大会中发布很多东西,所以我想强调几样重要的东西:
这只是所有发布特性中的一些简单示例;想了解更多,请查看WWDC session videos和已更新的Swift Programming Language book
如果还有一些人记得在Swift第一个beta版和发布的1.0之间有很多改变,那么将来肯定会有更多地特性出现。我们团队将会持续关注所有的更新,深入挖掘令人兴奋的改变,所以请密切留意教程,书籍和视频。
Swift 2哪部分最令你兴奋?哪部分你想我们第一时间报道?在下面评论让我们知道!
标签:
原文地址:http://www.cnblogs.com/zdfreshair2012/p/4667325.html