Closures

2017-10-24  本文已影响0人  夜雨聲煩_
总结

本章的闭包含义其实就是相对简单的匿名函数,要注意传入闭包作为参数时实际上需要传入的直接为闭包函数的实现内容(函数体)
而函数收到闭包参数时,可以选择在函数内执行闭包,也可以选择将闭包引用传递给其他变量(这就是非逃逸闭包逃逸闭包(@escaping)的区别),逃逸闭包只有当真正调用闭包时才会执行闭包内部的内容。
不使用自动闭包关键字时传入闭包作为参数需要大括号体现完整的闭包(函数体)特征,而使用自动闭包关键字(@autoclosure)时则不需大括号。
闭包作为函数返回值时,首先传入函数参数获取对应闭包,在调用闭包时执行闭包内代码,闭包内可以捕获一些闭包定义时上下文中的一些变量。

实例
//Example for Escaping Closures and Autoclosures
//定义一个用于储存某种函数(实际上是闭包)的数组
var customerProviders: [() -> String] = []
//定义某个以自动逃逸闭包作为参数,闭包无参数返回string类型,函数本身无返回值
func collectCusromerProviders(_ customerProvider: @autoclosure @escaping () -> String) {
    //@escaping关键字,闭包没有直接实现,而是传递给数组保存
    customerProviders.append(customerProvider)
}

//由于使用@autoclosure关键字,否则collectCusromerProviders({customersInLine.remove(at: 0)})
//执行函数,并将闭包customersInLine.remove(at: 0)作为参数传入
collectCusromerProviders(customersInLine.remove(at: 0))
collectCusromerProviders(customersInLine.remove(at: 0))

//两个闭包保存在数组中
print("Collected \(customerProviders.count) clousers.")

//遍历闭包数组,执行数组中闭包
for customerProvider in customerProviders {
    print("Now serving \(customerProvider())!")
}
上一篇 下一篇

猜你喜欢

热点阅读