双语言网站源码/aso优化运营
自动闭包就是将一个非闭包形式的表达参数 自动转化为闭包的表达形式并且传给一个普通函数表达形式。
//声明一个数组
var nameArray = ["li","yuan","long","is"]//函数声明 参数是一个普通闭包类型 (该闭包没有参数有返回值String类型)
func removeName(nameIndex:()->String){//输出语句中,调用了自身参数即闭包,此时闭包才会被执行print("nameArray first name is \(nameIndex())")
}//函数调用。参数传入一个定义好的闭包 该闭包的功能是删除数组中第一个元素
removeName(nameIndex: {()->String in return nameArray.remove(at: 0)})
//removeName(nameIndex: {()->String in nameArray.remove(at: 0)})//尾随闭包的写法
//removeName(){()->String in nameArray.remove(at: 0)}
//removeName(){nameArray.remove(at: 0)}
//上记输出是nameArray first name is li 因为 闭包在执行前 调用的输出语句因此数组中的元素未来的删除//函数声明 参数是一个自动闭包
func removeNameAuto(nameIndex: @autoclosure ()->String){print("auto ameArray first name is \(nameIndex())")
}
//函数调用并传入一个普通的表达式,因为是自动的闭包,会将该普通的表达式自动转化为闭包传入。
removeNameAuto(nameIndex: nameArray.remove(at: 0))
//上记输出是auto ameArray first name is yuan 因为removeName中的参数 闭包在执行时删除了一个元素故输出了 yuan
自由闭包和逃离闭包相结合
//声明一个元素时字符串类型数组
var nameArray = ["li","yuan","long","is"]
//声明一个元素是闭包类型数组
var nameClosureArray:[()->String] = []
//定义一个函数 函数参数是 自动闭包 且 逃离闭包 的类型的闭包
func handle(spendClosure:@autoclosure @escaping ()->String){//将参数 添加到闭包类型的数组中nameClosureArray.append(spendClosure)
}
//调用函数 这样闭包数组 会添加两个元素 但是 添加进去的闭包不会被执行
//因为是自动闭包 所以此处的参数可以为普通表达形式 自动会转为闭包类型
handle(spendClosure : nameArray.remove(at: 0))
handle(spendClosure : nameArray.remove(at: 0))
//打印闭包数组中有几个元素
print("nameClosureArray have \(nameClosureArray.count) closures.")
// 打印 nameClosureArray have 2 closures.//for循环执行闭包数组中的每一个闭包
for nca in nameClosureArray{print("nameArray first name is \(nca())")
}// 打印nameArray first name is li
//nameArray first name is yuan