非逃逸闭包, 永远不会离开一个函数的局部作用域的闭包就是非逃逸闭包。
func player(complete:(Bool)->()){
complete(true) //执行闭包 传入真
}
self.player { bool in
print( bool ? "yes":"no")
} // yes
当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸。在形式参数前写@escaping来明确闭包是允许逃逸的。
var completionHanglers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHangler: @escaping () -> Void) {
completionHanglers.append(completionHangler)
}
completionHanglers.first?()
自动闭包:是一种自动创建的闭包,用来把作为实际参数传递给函数的表达式打包的闭包.他不接受任何实际参数,并且当它被调用时,它会返回内部打包的表达式的值.
Autoclosure 是用于延迟执行闭包的一种技术。使用 Autoclosure,我们可以将闭包作为参数传递给函数或方法,但是闭包不会立即执行。相反,它会在需要时才会被执行。
public func assert(_ condition:@autoclosure () -> Bool,_ message: @autoclosure () -> String = String(), file:StaticString = #file, line: Unit = #line)
let num = 3
assert(num>3,"num不能大于3")
var customersInLine = ["李一", "张2", "刘3", "赵四", "王五"]
override func viewDidLoad() {
super.viewDidLoad()
print(customersInLine.count)
// 打印出“5”
let customerProvider = { self.customersInLine.remove(at: 0) }//自动闭包
print(customersInLine.count)//没有执行呢还 还是打印出“5”
print("移除了 \(customerProvider())!") //移除了 李一!
print(customersInLine)
serve(customer: customersInLine.remove(at: 0))
// 不用 @autoclosure 修饰
serve2(customer: { customersInLine.remove(at: 0) } )
}
func serve(customer customerProvider: @autoclosure () -> String) {
print("移除了 \(customerProvider())!")
print(customersInLine)
}
func serve2(customer customerProvider: () -> String) {
print("移除了 \(customerProvider())!")
print(customersInLine)
}