zoukankan      html  css  js  c++  java
  • Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结

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

     

     

    1defer关键字1

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

    3Guard 4

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

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

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

    7ref7

     

    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://blog.csdn.net/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

  • 相关阅读:
    面试经验
    二叉树和递归
    优先队列
    队列问题
    书法学习资料
    栈的问题
    Git常用命令
    字母大小写转换
    深入类中的方法[8] - 抽象方法与抽象类
    深入类中的方法[7] - 关于 inherited
  • 原文地址:https://www.cnblogs.com/attilax/p/15198737.html
Copyright © 2011-2022 走看看