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

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

1.defer关键字1

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

3.Guard 4

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

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

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

7.ref7

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操作速度快.


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

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

7.ref

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

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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...