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)