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(@autoclosure predicate: () -> Bool) {
if predicate() {
print("True")
}
}
这时候我们就可以直接写:
logIfTrue(2 > 1)
来进行调用了,Swift 将会把 2 > 1
这个表达式自动转换为 () -> Bool
。这样我们就得到了一个写法简单,表意清楚的式子。
请发表评论