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 ...
随机推荐
- codeforces-540C
题目连接:http://codeforces.com/problemset/problem/540/C C. Ice Cave time limit per test 2 seconds memory ...
- oracle free space
--Size of All Table Space --1. Used Space SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024 ...
- 信息批量提取工具bulk-extractor
信息批量提取工具bulk-extractor 在数字取证中,通常需要面对海量的数据,如几百GB甚至TB级别的数据.从这些海量数据中,提取有价值的数据是一个漫长.枯燥.繁琐的过程.Kali Linu ...
- TestList汇总
[基本类型] 类的构造方法调用问题 重载复写的区别 Final finally finalized 的区别 定义final变量是否需要初始化 forward和redirect的区别 equals方法和 ...
- Java多线程设计模式(1)
1 线程中的几个方法解释 Thread.sleep(long 毫秒) 在指定的时间内让当前线程休眠,将控制权交给其他线程,休眠的线程依旧拥有它所占用的锁, Thread.yield(); 暂停或者放弃 ...
- 转:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!
引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...
- UBI文件系统简介
转:http://www.embedu.org/Column/Column102.htm 在linux-2.6.27以前,谈到Flash文件系统,大家很多时候多会想到cramfs.jffs2.yaff ...
- 【spring mvc】后台API查询接口,get请求,后台Date字段接收前台String类型的时间,报错default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createDate';
后台API查询接口,get请求,后台Date字段接收前台String类型的时间筛选条件 后台接口接收 使用的实体 而createDate字段在后台实体中是Date类型 报错信息: org.spring ...
- 手把手教你AndroidStudio多渠道打包
最近不断有朋友向我咨询AndroidStudio多渠道的打包方法,今天整理一下之前积累的打包套路,写一篇文章,手把手的教给大家. 说到多渠道,这里不得不提一下友盟统计,友盟统计是大家日常 ...
- python多线程,守护线程
https://www.cnblogs.com/liuyang1987/p/6292321.html