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代码块中执行必须要执行的代码,不管之前怎样的兴风作浪。在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 总结的更多相关文章

  1. Atitit opencv版本新特性attilax总结

    Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...

  2. Atitit.jquery 版本号新特性attilax总结

    Atitit.jquery 版本号新特性attilax总结 1. Jq1.4 1 2. 1.5 1 3. 1.6 3 4. Jq1.7 3 ⒉提升了事件委派时的性能有了大幅度的提升.尤其是在ie7下: ...

  3. 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 ...

  4. Atitit.jquery 版本新特性attilax总结

    Atitit.jquery 版本新特性attilax总结 1. Jq1.4 1 2. 1.5 1 3. 1.6 3 4. Jq1.7 3 ⒉提升了事件委派时的性能有了大幅度的提升,尤其是在ie7下: ...

  5. atitit.atiLinq v2新特性attilax大总结 q326

    atitit.atiLinq v2新特性attilax大总结 q326 1. V3规划 (分开sql2obj sql2sql sql2xml)1 2. V2新特性 Url linq的定义1 3. V1 ...

  6. Atitit.atiDataStoreService   v2 新特性

    Atitit.atiDataStoreService   v2 新特性 1.1. V1  基础实现1 1.2. V2  增加了对  $uuid  $cur_uid参数的支持1 1.3. 增加了fld  ...

  7. Atitit  atiMail atiDns新特性 v2  q39

    Atitit  atiMail atiDns新特性 v2  q39 V1  实现了基础的功能 V2  重构..使用自然语言的方式 c.According_to_the_domain_name(&quo ...

  8. Atitit.aticmd v4  新特性q39 添加定时器释放功能

    Atitit.aticmd v4  新特性q39 添加定时器释放功能 V1  实现兰cmd V2 标准输入,标准输出,标准错误与重新定向 V3  stdout stderr统一重新定向 V4  添加定 ...

  9. Swift 3 新特性和迁移详解

    写在前面 Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0.所以写点小总结. 背景 代码量(4万行) 首先,我是今年年初才开始入手 S ...

随机推荐

  1. 51nod 1101 换零钱 【完全背包变形/无限件可取】

    1101 换零钱  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 ...

  2. Codeforces Round #428 A. Arya and Bran【模拟】

    A. Arya and Bran time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  3. u-boot-2010.3移植到Tiny6410问题总结

    问题1: u-boot-2010.3中nand_spl文件夹的作用:实现从Nandflash启动在编译是会建立几个链接文件,用这几个链接文件生成u-boot-spl-16k.bin nand_spl/ ...

  4. UBIFS - UBI File-System

    参考:http://www.linux-mtd.infradead.org/doc/ubifs.html#L_raw_vs_ftl UBIFS - UBI File-System Table of c ...

  5. sharepoint2010无法连接到配置数据库。

    最近VS部署又遇到这个问题了,记录一下. 然后以管理员省份打开sharePoint管理中心,发现页面展示光秃秃的“无法连接到配置数据库” 解决方式:问的同事. 找到计算机 服务 项, 这个启动下 这个 ...

  6. C和C++中函数运行时间测试

    //clock()函数为c中,捕捉从程序开始运行到clock运行的时间//时间单位为clock tick,即为时钟打点#include<iostream>#include<cmath ...

  7. WIN7无法卸载掉中文繁体注音输入法

    WIN7无法卸载掉中文繁体注音输入法 不知何时系统里被自动安装了个中文繁体的注音输入法,每次启动都会替换默认的简体搜狗拼音,而且最要命的是在输入法选择栏里面没有出现这个繁体的输入法,而任务栏里却总是有 ...

  8. POJ 2983-Is the Information Reliable?(差分约束系统)

    题目地址:POJ 2983 题意:有N个车站.给出一些点的精确信息和模糊信息.精确信息给出两点的位置和距离.模糊信息给出两点的位置.但距离大于等于一.试确定是否全部的信息满足条件. 思路:事实上就是让 ...

  9. 编译spark源码及塔建源码阅读环境

    编译spark源码及塔建源码阅读环境 (一),编译spark源码 1,更换maven的下载镜像: <mirrors> <!-- 阿里云仓库 --> <mirror> ...

  10. Eclipse web项目导入Intellij 并且部署

    一.导入自己的web项目 步骤:File->New->Project from Existing Source... 二.选择项目的所在位置,点击"OK";接着如下图所 ...