Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结

Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结

 

 

1defer关键字1

2try!形式存在的“不失败”机制3

3Guard 4

4swift的新语法,可以很好地支持内部DSL 6

5Tuple 的好处  Tuple 就是不能update的list 。Tuple 比 list 操作速度快.6

6私有属性?很多语言都没有,都靠使用者自觉 7

7ref7

 

1. defer关键字

在一些语言中,有try/finally这样的控制语句,比如Java。这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪。在Swift 2.0中,Apple提供了defer关键字,让我们可以实现同样的效果。

这是目前为止我最爱的 Swift 新特性(又见最爱……)。defer语句与很多其他语言中的finally语句很像,不过它不需要与try语句绑定在一起,你可以把它放在任何你想放的位置。如果你写了defer{…},那么那个代码块中的代码就会在控制离开当前函数的范围时执行,无论函数最后是运行到了结尾,还是遇到了return语句,或者是抛出了错误。

 

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:[email protected]

转载请注明来源: http://www.cnblogs.com/attilax/

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

func checkSomething() {

     

    print("CheckPoint 1")

    doSomething()

    print("CheckPoint 4")

     

}

func doSomething() {

     

    print("CheckPoint 2")

    defer {

        print("Clean up here")

    }

    print("CheckPoint 3")

     

}

checkSomething() // CheckPoint 1, CheckPoint 2, CheckPoint 3, Clean up here, CheckPoint 4

 

上述示例可以看到,在打印出“CheckPoint 2”之后并没有打印出“Clean up here”,而是“CheckPoint 3”,这就是defer的作用,它对进行了print("Clean up here")延迟。我们再来看一个I/O的示例:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

// 伪代码

func writeSomething() {

     

    let file = OpenFile()

     

    let ioStatus = fetchIOStatus()

    guard ioStatus != "error" else {

        return

    }

    file.write()

     

    closeFile(file)

     

}

 

上述示例是一个I/O操作的伪代码,如果获取到的ioStatus正常,那么该方法没有问题,如果ioStatus取到的是error,那么会被guard语句抓到执行return操作,这样的话closeFile(file)就永远都不会执行了,一个严重的Bug就这样产生了。下面我们看看如何用defer来解决这个问题:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

// 伪代码

func writeSomething() {

     

    let file = OpenFile()

    defer {

        closeFile(file)

    }

     

    let ioStatus = fetchIOStatus()

    guard ioStatus != "error" else {

        return

    }

    file.write()

     

}

 

我们将closeFile(file)放在defer代码块里,这样即使ioStatus为error,在执行return前会先执行defer里的代码,这样就保证了不管发生什么,最后都会将文件关闭。

defer又一个保证我们代码健壮性的特性,我非常喜欢。

 

2. try!形式存在的“不失败”机制

另外一个与 Java 不同的地方是,Swift 有一个内嵌的以try!形式存在的“不失败”机制。有时一个方法只会在某种情况下调用失败,并且你知道你所使用的那种情况下它是不会失败的。上述getBytes调用就是 Java 中的一个很好的例子:它抛出UnsupportedEncodingException但是它能保证传入“UTF-8”时一定不会抛出异常。即使你知道这不会失败但调用时需要用try来解包。在 Swift 中,你可以使用try!来完成这些,既清楚又简短。这与“!”后缀语法配合得很好,!后缀用来解包你知道肯定不会为nil的可选类型,就像上面的dataUsingEncoding,类似的还有as!操作符来转换类型并且你已知这个操作肯定会成功。

3. Guard

这看起来好多了,但是烦人的是,条件现在被反转为检查错误情况而不是正确情况了。

优点::减少语句,and ide检查

更糟的是如果你忘了return语句,编译器就不管了,你的代码会开开心心地在错误情况执行完之后继续执行。guard解决了所有这些问题:

编译器那里获得了更多的帮助

let fd2 = open(...)if fd2 == -1 {

    // handle fd2 error

    close(fd1)

    return

}

// use fd1 and fd2 here

close(fd1)

 

let fd1 = open(...)

guard fd1 >= 0 else {

    // handle fd1 error

    return

}

let fd2 = open(...)

guard fd2 >= 0 else {

    // handle fd2 error

    close(fd1)

    return

}

// use fd1 and fd2 here

close(fd1)

close(fd2)

这就更好了!这看起来更清晰了,并且从编译器那里获得了更多的帮助。但是这并没有什么特别的啊,那为什么这是我最喜欢的呢?那是因为,跟if语句一样,guard语句也可以包含变量声明并且检查是否为nil。但guard语句又不像if语句那样,声明的变量不仅仅是在guard语句范围内可用。为了帮助大家理解,我们先来看上面例子的一个可选类型版本,首先是那个金字塔:

 

4. swift的新语法,可以很好地支持内部DSL

 有一种编程风格,不太好归类。就是将程序拆分成,描述+解释。解释部分写一次,其它地方使用描述式的语句,而不是命令式的语句。

内部DSL,通常利用主语言的语法特性,创出一套写法,来写一些描述性的语句。这些语句组合起来,就像一门新语言似得。这个比较难理解。举个例子(从ruby那里借过来的),假如计算,几小时之后的秒数。C语言中,大概会写成

5. Tuple 的好处  Tuple 就是不能update的list 。Tuple 比 list 操作速度快.


Tuple 比 list 操作速度快.如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list.
如果对不需要修改的数据进行 “写保护”,可以使代码更安全.使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量.如果必须要改变这些值,则需要执行 tuple 到 list 的转换.

 

6. 私有属性?很多语言都没有,都靠使用者自觉

7. ref

Swift 2.0初探:值得注意的新特性 - CocoaChina_让移动开发更简单.htm

Swift 中最棒的新特性 简书.htm

 

你可能感兴趣的:(Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结)