如下为官方文档的定义,但是建议你忽略它,搞懂了自动闭包再来看才容易懂:)
自动闭包是一种自动创建的闭包,用于包装传递给函数作为参数的表达式。这种闭包不接受任何参数,当它被调
用的时候,会返回被包装在其中的表达式的值。这种便利语法让你能够省略闭包的花括号,用一个普通的表达式
来代替显式的闭包。复制代码
这是一个正常的闭包的定义和调用:
func foo(_ i:() -> Int) {
print(i())
}
foo({return 42})复制代码
结果会打印42出来。可以使用{}
创建一个闭包,并把它传递到foo函数,foo函数会打印此闭包的返回结果。当然,因为返回值明确,可以省略return。让代码更加简洁。
func foo(_ i:() -> Int) {
print(i())
}
foo({42})复制代码
你也常常会使用尾随闭包,把最后一行写成:
foo(){42}复制代码
或者:
foo{42}复制代码
然而,使用自动闭包,代码可以更省,省掉{}
,就像这样:
func bar(_ i:@autoclosure () -> Int) {
print(i())
}
bar(42)复制代码
42只是一个返回整数的表达式,为什么可以传递给类型为闭包的参数呢?因为加上了@autoclosure标记后,编译器会自动把传递的表达式加上{}
,从而转换为闭包。这里的自动就体现在此了。要求就是表达式的返回值和闭包的返回值类型一致即可。
现在你回头看,官方文档字字都对。但是之前是看不懂的。起码我看不懂。
能省则省,这样的语法,尽管程序员不一定都用它,但是喜欢。