什么是自动闭包
自动闭包是一种自动创建的闭包, 用于包装传递给函数作为参数的表达式。这种闭包不接受任何参数,当它被调用的时候,会返回被包装在其中的表达式的值。
这种语法让你能够省略闭包的花括号,用一个普通的表达式来代替显式的闭包。除了简化写法,还有一个需要注意的就是自动闭包所包含的代码是延迟执行的。
下面代码中的 arraysProvider 就是一个自动闭包。
var arrays = ["1", "2", "3", "4", "5"]
print(arrays.count)
// 打印出“5”
let arraysProvider = { arrays.remove(at: 0) }
print(arrays.count)
// 打印出“5”
print("Now serving \(arraysProvider())!")
// Prints "Now serving 1!"
print(arrays.count)
// 打印出“4”
什么是@autoclosure
@autoclosure 是帮助开发者简化闭包写法的一个语法糖, 当函数的入参是一个闭包时,我们通常会这么写代码:
var arrays = ["1", "2", "3", "4", "5"]
print(arrays.count)
// 打印出“5”
let arraysProvider = { arrays.remove(at: 0) }
print(arrays.count)
// 打印出“5”
print("Now serving \(arraysProvider())!")
// Prints "Now serving 1!"
print(arrays.count)
// 打印出“4”
func server(provider: () -> String) {
print("Now serving \(provider())!")
}
server(provider: arraysProvider)
// 打印出“Now serving 2!”
但使用 @autoclosure 后,代码将简化成如下的形式:
var arrays = ["1", "2", "3", "4", "5"]
print(arrays.count)
// 打印出“5”
let arraysProvider = { arrays.remove(at: 0) }
print(arrays.count)
// 打印出“5”
print("Now serving \(arraysProvider())!")
// Prints "Now serving 1!"
print(arrays.count)
// 打印出“4”
func server(provider: () -> String) {
print("Now serving \(provider())!")
}
server(provider: arraysProvider)
// 打印出“Now serving 2!”
func server(provider: @autoclosure () -> String) {
print("Now serving \(provider())!")
}
server(provider: arrays.remove(at: 0))
// 打印“Now serving 3!”
Xcode的自动提示也会变成:
所以调用 server 方法时,provider 的参数值不用再使用 { } 来显示声明此处是一个闭包,系统会根据 @autoclosure 自动将对应参数转化为闭包。
应用场景
当你设计的函数入参是一个用意明确的闭包且需要被延迟执行时, 就可以用 @autoclosure。