iOS Swift自动闭包auto closures

什么是自动闭包

自动闭包是一种自动创建的闭包, 用于包装传递给函数作为参数的表达式。这种闭包不接受任何参数,当它被调用的时候,会返回被包装在其中的表达式的值。

这种语法让你能够省略闭包的花括号,用一个普通的表达式来代替显式的闭包。除了简化写法,还有一个需要注意的就是自动闭包所包含的代码是延迟执行的。

下面代码中的 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

发布了249 篇原创文章 · 获赞 926 · 访问量 149万+

猜你喜欢

转载自blog.csdn.net/youshaoduo/article/details/100917438