美文网首页
ios 经典面试案例 (六)

ios 经典面试案例 (六)

作者: 小小鱼类 | 来源:发表于2018-03-28 15:27 被阅读18次

    Swift autoclosure的作用?

    1:自动闭包,顾名思义是一种自动创建的闭包,用于包装函数参数的表达式,可以说是一种简便语法.
    2:自动闭包不接受任何参数,被调用时会返回被包装在其中的表达式的值。
    3:自动闭包的好处之二是让你能够延迟求值,因为代码段不会被执行直到你调用这个闭包,这样你就可以控制代码什么时候执行。
    4:含有autoclosure特性的声明同时也具有noescape的特性,及默认是非逃逸闭包,除非传递可选参数escaping.如果传递了该参数,那么将可以在闭包之外进行操作闭包,形式为:请使用@autoclosure(escaping)。

    实战操作理解:
    /// 我们定义有一个方法接受一个闭包,当闭包执行的结果为true的时候进行打印:

    func method(result:() -> Bool) {
        if result() {
            print("method")
        }
    }
    
      1. 直接挑用方法
    method { () -> Bool in
        return true
    }
    
      1. 闭包在园括号里
    method(result: {return true})
    
      1. 使用尾部闭包方式,闭包体在圆括号之外
    method(){return true}
    
      1. 在 Swift 中对闭包的用法可以进行一些简化,在这种情况下我们可以省略掉 return,写成:
    method(){true}
    
    • 5:还可以更近一步,因为这个闭包是最后一个参数,所以可以使用尾随闭包 (trailing closure) 的方式把大括号拿出来,然后省略括号,变成:
    method {true}
    

    但是不管哪种方式,表达上不太清晰,看起来不舒服。于是@autoclosure就登场了。我们可以改换方法参数,在参数名前面加上@autoclosure关键字:

    func method1( result:@autoclosure ()->Bool) {
        if result() {
            print("method1")
        }
    }
    

    调用下,我们看一下

    method1(result: true)
    

    上面调用是不是舒服多了,直接进行调用了,Swift 将会把 true 这个表达式自动转换为 () -> Bool。这样我们就得到了一个写法简单,表意清楚的式子。

    1个闭包优势可能不是那么的明显,如果有多个闭包,那么优势就明显了,而@autoclosure是可以修饰任何位置的参数:
    我们先看看不加@autoclosure,使用时是什么样子

    func method3(result1: ()->Bool, result2:  ()->Bool) {
        if result1() && result2() {
            print("method3 ... 0")
            return
        }
        print("method3 ... 1")
    }
    
    method3(result1: {5 > 1}, result2: {4 > 3})
    

    我们加上@autoclosure之后对比下:

    func method4(result1: @autoclosure ()->Bool, result2:  @autoclosure ()->Bool) {
        if result1() && result2() {
            print("method4 ... 0")
            return
        }
        print("method4 ... 1")
    }
    
    method4(result1: 5 > 1, result2: 4 > 3
    

    题的搬运,不成敬意!

    相关文章

      网友评论

          本文标题:ios 经典面试案例 (六)

          本文链接:https://www.haomeiwen.com/subject/hydscftx.html