美文网首页
@autoclosure(自动闭包)

@autoclosure(自动闭包)

作者: 秋分落叶 | 来源:发表于2019-09-24 14:52 被阅读0次

Apple 为了推⼲和介绍 Swift,破天荒地为这⻔语⾔开设了⼀个博客(当然我觉着是因为 Swift 坑太多需要⼀个地⽅来集中解释)。其中有⼀篇提到了⼀个叫做 @autoclosure 的关键词。

@autoclosure 可以说是 Apple 的⼀个⾮常神奇的创造,因为这更多地是像在 “hack” 这⻔语⾔。简单说, @autoclosure 做的事情就是把⼀句表达式⾃动地封装成⼀个闭包 (closure)。这样有时候在语法上看起来就会⾮常漂亮。

⽐如我们有⼀个⽅法接受⼀个闭包,当闭包执⾏的结果为 true 的时候进⾏打印:

func logIfTrue(_ predicate: () -> Bool) {
  if predicate() {
    print("true")
  }
}

在调⽤的时候,我们需要写这样的代码

logIfTrue({return 2 > 1}

当然,在 Swift 中对闭包的⽤法可以进⾏⼀些简化,在这种情况下我们可以省略掉 return ,写成:

logIfTrue({2 > 1})

还可以更近⼀步,因为这个闭包是最后⼀个参数,所以可以使⽤尾随闭包 (trailing closure) 的⽅式把⼤括号拿出来,然后省略括号,变成:

logIfTrue{2 > 1}

但是不管哪种⽅式,要么是书写起来⼗分⿇烦,要么是表达上不太清晰,看起来都让⼈⽣⽓。于是 @autoclosure 登场了。我们可以改换⽅法参数,在参数名前⾯加上 @autoclosure 关键字:

 func logIfTrue(_ predicate:@autoclosure () -> Bool) {
        if predicate() {
            print("true")
        }
    }

这时候我们就可以直接写:

logIfTrue(2>1)

举例说明:实现(||)操作运算

    func || (left:Bool, right:Bool)-> Bool {
        if left {
            return true
        }else {
            return right
        }
    }

上面这种解法勉强正确,但是并不高效,或(||)操作的本质是当左边为真的时候,我们无需计算右边。而上面这种是将右边值默认准备好,再传入进行操作。当右边值得计算十分复杂时会造成了性能上的浪费。所以,以上这种做法违反了或(||)操作的本质。正确的实现方法如下:

    func ||(left:Bool, right: @autoclosure()->Bool) -> Bool {
        if left {
            return true
        }else {
            return right()
        }
    }

autoclosure可以将右边值的计算推迟到判定left为false的时候,这样就可以避免第一种方法带来的不必要的开销了。

相关文章

  • Swift 关于AUTOCLOSURE 和 ??

    转正:autoclosure:可理解为自动识别的闭包http://swifter.tips/autoclosure/

  • 自动闭包@autoclosure

    自动闭包@autoclosure 什么是自动闭包 自动闭包就是把一个表达式直接自动闭合一个闭包,这样看起来就比较好...

  • @autoclosure(自动闭包)

    Apple 为了推⼲和介绍 Swift,破天荒地为这⻔语⾔开设了⼀个博客(当然我觉着是因为 Swift 坑太多需要...

  • ios 经典面试案例 (六)

    Swift autoclosure的作用? 1:自动闭包,顾名思义是一种自动创建的闭包,用于包装函数参数的表达式,...

  • @autoclosure 和 ??

    自动关闭关键字 @autoclosure 使用与参数类型的()-> T 的闭包 ,这个闭包的参数为空,带有参数的闭...

  • @autoclosure、@noescape和@escape

    @autoclosure:字面意思为自动闭包,该关键字用于在函数或者方法的闭包类型参数前面,但是闭包类型被限定在无...

  • 从??(空合运算符)看autoclosure

    ## 1:autoclosure初识 先看一下书上的解释:自动闭包是一种自动创建的闭包,用于包装传递给函数作为参数...

  • swift @autoclosure(自动闭包)

    Apple 为了推⼲和介绍 Swift,破天荒地为这⻔语⾔开设了⼀个博客(当然我觉着是因为 Swift 坑太多需要...

  • Swift基础知识

    autoclosure @autoclosure 做的事情就是把一句表达式自动地封装成一个闭包。用法就是在类型签名...

  • [swift 进阶]读书笔记-第六章:函数 C6P6_7 自动

    第六章:函数(function) 6.6 自动闭包。 本节主要知识点: 对@autoclosure 和@escap...

网友评论

      本文标题:@autoclosure(自动闭包)

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