swiftswift相关

swift @autoclosure(自动闭包)

2018-08-06  本文已影响4人  ikonan

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)
上一篇 下一篇

猜你喜欢

热点阅读