Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结
Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结
5. Tuple 的好处 Tuple 就是不能update的list 。Tuple 比 list 操作速度快.6
1. defer关键字
在一些语言中,有try/finally这样的控制语句,比如Java。这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪。在Swift 2.0中,Apple提供了defer关键字,让我们可以实现同样的效果。
这是目前为止我最爱的 Swift 新特性(又见最爱……)。defer语句与很多其他语言中的finally语句很像,不过它不需要与try语句绑定在一起,你可以把它放在任何你想放的位置。如果你写了defer{…},那么那个代码块中的代码就会在控制离开当前函数的范围时执行,无论函数最后是运行到了结尾,还是遇到了return语句,或者是抛出了错误。
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: 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 总结的更多相关文章
- Atitit opencv版本新特性attilax总结
Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...
- Atitit.jquery 版本号新特性attilax总结
Atitit.jquery 版本号新特性attilax总结 1. Jq1.4 1 2. 1.5 1 3. 1.6 3 4. Jq1.7 3 ⒉提升了事件委派时的性能有了大幅度的提升.尤其是在ie7下: ...
- Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc dtS312 s2018 s3f doc compc\Atitit PathUtil 工具新特性新版本 v8 s312.docx s2018 s3f doc compc\Atitit 操作日
Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc ...
- Atitit.jquery 版本新特性attilax总结
Atitit.jquery 版本新特性attilax总结 1. Jq1.4 1 2. 1.5 1 3. 1.6 3 4. Jq1.7 3 ⒉提升了事件委派时的性能有了大幅度的提升,尤其是在ie7下: ...
- atitit.atiLinq v2新特性attilax大总结 q326
atitit.atiLinq v2新特性attilax大总结 q326 1. V3规划 (分开sql2obj sql2sql sql2xml)1 2. V2新特性 Url linq的定义1 3. V1 ...
- Atitit.atiDataStoreService v2 新特性
Atitit.atiDataStoreService v2 新特性 1.1. V1 基础实现1 1.2. V2 增加了对 $uuid $cur_uid参数的支持1 1.3. 增加了fld ...
- Atitit atiMail atiDns新特性 v2 q39
Atitit atiMail atiDns新特性 v2 q39 V1 实现了基础的功能 V2 重构..使用自然语言的方式 c.According_to_the_domain_name(&quo ...
- Atitit.aticmd v4 新特性q39 添加定时器释放功能
Atitit.aticmd v4 新特性q39 添加定时器释放功能 V1 实现兰cmd V2 标准输入,标准输出,标准错误与重新定向 V3 stdout stderr统一重新定向 V4 添加定 ...
- Swift 3 新特性和迁移详解
写在前面 Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0.所以写点小总结. 背景 代码量(4万行) 首先,我是今年年初才开始入手 S ...
随机推荐
- 第十四届华中科技大学程序设计竞赛 B Beautiful Trees Cutting【组合数学/费马小定理求逆元/快速幂】
链接:https://www.nowcoder.com/acm/contest/106/B 来源:牛客网 题目描述 It's universally acknowledged that there'r ...
- 注册表数据提取工具RegRipper
注册表数据提取工具RegRipper 注册表是Windows操作系统一个数据库,用来存储系统和应用程序设置信息.注册表信息分别保存在操作系统中的6个Hive文件中.获取这几个文件,就可以从中提取注 ...
- [POI2014]FarmCraft
题目大意: 一个$n(n\le5\times10^5)$个点的树,每个点有一个权值$c_i$,从$1$出发进行欧拉遍历,每个单位时间移动一条边,记每个点$i$被访问到的时间是$t_i$,问最后$\ma ...
- Linux下查看某个进程的网络带宽占用情况
说明: 1.可能查看某个进程的带宽占用需要明确知道PID.进程名字.发送速度.接收速度. 2.很遗憾,在Linux原生的软件中没有这样的一款,只能额外装,最符合以上的情况就只有nethogs. 3.n ...
- 响应头里的"Last-Modified"值是怎么来的?
1.如图所示,app.js文件得到的响应头的"Last-Modified"数值是:Mon, 09 Sep 2013 09:18:22 GMT 我们查看服务器上的app.js文件的修 ...
- Chrome的Waterfall
参考: 1.https://developers.google.com/web/tools/chrome-devtools/network-performance/reference#timing 2 ...
- Microsoft-PetSop4.0(宠物商店)-数据库设计-Oracle
ylbtech-DatabaseDesgin:Microsoft-PetSop4.0(宠物商店)-数据库设计-Oracle DatabaseName:PetShop(宠物商店) Model:宠物商店网 ...
- 关于VS下的应用程序出现0xc000007b的问题以及OpenCV相关的0xc000007b问题
本文参考过其他一些文章: http://www.cnblogs.com/csuftzzk/p/windows_launch_error_0xc000007b.html 这个问题在网上一查一大堆,主要的 ...
- 淘宝开源项目之Tsar
软件介绍: Tsar是淘宝开发的一个非常好用的系统监控工具,在淘宝内部大量使用,它不仅可以监控CPU.IO.内存.TCP等系统状态,也可以监控Apache,Nginx/Tengine,Squid等服务 ...
- ElasticSearch 排序
1.相关性排序 ElasticSearch为了按照相关性来排序,需要将相关性表示为一个数值,在 Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过 _score 参 ...