Atitit.swift的新特性以及与java的对比改进方向attilax总结
5.Tuple的好处Tuple就是不能update的list。Tuple比list操作速度快.6
1.defer关键字
在一些语言中,有try/finally这样的控制语句,比如Java。这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪。在Swift2.0中,Apple提供了defer关键字,让我们可以实现同样的效果。
这是目前为止我最爱的Swift新特性(又见最爱……)。defer语句与很多其他语言中的finally语句很像,不过它不需要与try语句绑定在一起,你可以把它放在任何你想放的位置。如果你写了defer{…},那么那个代码块中的代码就会在控制离开当前函数的范围时执行,无论函数最后是运行到了结尾,还是遇到了return语句,或者是抛出了错误。
作者::绰号:老哇的爪子(全名::AttilaxAkbarAlRapanui阿提拉克斯阿克巴阿尔拉帕努伊)汉字名:艾龙,EMAIL:1466519819@qq.com
转载请注明来源:http://blog.csdn.net/attilax
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
funccheckSomething(){
print("CheckPoint1") doSomething() "CheckPoint4" } funcdoSomething(){ "CheckPoint2"defer{ "Cleanuphere"} "CheckPoint3"checkSomething()//CheckPoint1,CheckPoint2,CheckPoint3,Cleanuphere,CheckPoint4 |
上述示例可以看到,在打印出“CheckPoint2”之后并没有打印出“Cleanuphere”,而是“CheckPoint3”,这就是defer的作用,它对进行了print("Cleanuphere")延迟。我们再来看一个I/O的示例:
14 |
//伪代码 funcwriteSomething(){ letfile=OpenFile() letioStatus=fetchIOStatus() guardioStatus!="error"else{ return file.write() closeFile(file) } |
上述示例是一个I/O操作的伪代码,如果获取到的ioStatus正常,那么该方法没有问题,如果ioStatus取到的是error,那么会被guard语句抓到执行return操作,这样的话closeFile(file)就永远都不会执行了,一个严重的Bug就这样产生了。下面我们看看如何用defer来解决这个问题:
15 |
我们将closeFile(file)放在defer代码块里,这样即使ioStatus为error,在执行return前会先执行defer里的代码,这样就保证了不管发生什么,最后都会将文件关闭。 defer又一个保证我们代码健壮性的特性,我非常喜欢。
2.try!形式存在的“不失败”机制另外一个与Java不同的地方是,Swift有一个内嵌的以形式存在的“不失败”机制。有时一个方法只会在某种情况下调用失败,并且你知道你所使用的那种情况下它是不会失败的。上述getBytes调用就是Java中的一个很好的例子:它抛出UnsupportedEncodingException但是它能保证传入“UTF-8”时一定不会抛出异常。即使你知道这不会失败但调用时需要用来解包。在Swift中,你可以使用来完成这些,既清楚又简短。这与“!”后缀语法配合得很好,!后缀用来解包你知道肯定不会为nil的可选类型,就像上面的dataUsingEncoding,类似的还有as!操作符来转换类型并且你已知这个操作肯定会成功。 3.Guard这看起来好多了,但是烦人的是,条件现在被反转为检查错误情况而不是正确情况了。 优点::减少语句,andide检查 更糟的是如果你忘了语句,编译器就不管了,你的代码会开开心心地在错误情况执行完之后继续执行。guard解决了所有这些问题: 编译器那里获得了更多的帮助 letfd2=open(...)iffd2==-1{ //handlefd2error close(fd1) return } //usefd1andfd2here close(fd1)
fd1=open(...) guardfd1>=0else//handlefd1error } fd2=open(...) guardfd2>=close(fd2) 这就更好了!这看起来更清晰了,并且从编译器那里获得了更多的帮助。但是这并没有什么特别的啊,那为什么这是我最喜欢的呢?那是因为,跟if语句一样,语句也可以包含变量声明并且检查是否为。但语句又不像语句那样,声明的变量不仅仅是在语句范围内可用。为了帮助大家理解,我们先来看上面例子的一个可选类型版本,首先是那个金字塔:
4.swift的新语法,可以很好地支持内部DSL有一种编程风格,不太好归类。就是将程序拆分成,描述+解释。解释部分写一次,其它地方使用描述式的语句,而不是命令式的语句。 内部DSL,通常利用主语言的语法特性,创出一套写法,来写一些描述性的语句。这些语句组合起来,就像一门新语言似得。这个比较难理解。举个例子(从ruby那里借过来的),假如计算,几小时之后的秒数。C语言中,大概会写成 5.Tuple的好处Tuple就是不能update的list。Tuple比list操作速度快.
6.私有属性?很多语言都没有,都靠使用者自觉7.refSwift2.0初探:值得注意的新特性-CocoaChina_让移动开发更简单.htm Swift中最棒的新特性-简书.htm 猜你在找的Swift相关文章 |