闭包是自包含的函数代码块,可与你在代码中被传递和使用。swift的闭包和C、OC中的代码块blocks以及其它一些编程语言中的匿名函数较为相似。
闭包可捕获和存储其所在的上下文中的任意常量和变量的引用。也就是我们常说的常量包裹和变量包裹。
闭包通常有三种形式:
1:全局函数是一个有名字但不会捕获任何值的闭包
2:嵌套函数是一个有名字且可以捕获起封闭函数域内值的闭包
3:闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或者常量值的匿名闭包
闭包表达式的语法:
{ (参数) -> 返回值类型 in
表达式
}
闭包表达式参数 可以是 inout 参数,但不能设定默认值。也可以使用具名的可变参数
let alertVC = UIAlertController()
alertVC.addAction(UIAlertAction(title: "action1", style: .cancel, handler: nil))
alertVC.addAction(UIAlertAction(title: "action2", style: .default, handler: nil))
alertVC.addAction(UIAlertAction(title: "action3", style: .default, handler: { (UIAlertAction) -> Void in
NSLog("点击了action3")
}))
alertVC.addAction(UIAlertAction(title: "action4", style: .default) { _ in
NSLog("点击了action4")
})
self.present(alertVC, animated: true, completion: nil)
上面这个例子就说明了swift中闭包的表现形式以及具体使用
我们可以看到在action3中是一个完整形式的关于UIAlertAction的闭包,而在action4中采用了下划线_来省略了整个闭包参数及返回值。那么显然这种形式的闭包也是可以的。
尾随闭包:
如果你需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。在使用尾随闭包时,你不用写出它的参数标签:
self.present(alertVC, animated: true) {
NSLog("弹出AlertVC")
}
// 我们可以将present(alertVC, animated: true)作为一个完整的函数调用,而他后面的{ NSLog("弹出AlertVC") } 就是一个尾随闭包,实际上是把闭包作为present函数的另一个参数进行传递。
闭包中对于变量的捕获和OC中block的局部变量值捕获是相同意义的。闭包本身是一种饮用类型,因为无论是你将函数或闭包赋值给一个常量还是变量,你实际上都是将常量或变量的值设置为对应函数或闭包的引用。
除此之外,闭包含有逃逸闭包和自动闭包两种具体的展现形式。目前尚在学习之中,故本文现下不做过多解释。
以上,就是swift中关于闭包的相关内容。谢谢!