有写过OC的同学一定知道OC中又个Block
的概念,其实Swift中有一个也有与之对应的闭包
概念,说到闭包不得不说@autoclosure
关键字,其实就是自动闭包的意思。
先来看看Swift的闭包如何写?
override func viewDidLoad() {
super.viewDidLoad()
//直接调用方法
printText { () -> Int in
return 1
}
}
func printText(parameters: () -> Int) {
print(parameters())
}
我们思考一下,多个参数该如何写?写法如下:
override func viewDidLoad() {
super.viewDidLoad()
printText { () -> Int in
return 1
} parameters2: { () -> Int in
return 2
}
}
func printText(parameters: () -> Int, parameters2:() -> Int) {
print(parameters())
print(parameters2())
}
这时候我门直接调用了printText
方法在这个方法内输出了parameters()
输出的结果为我们return的数据,这就是最简单的闭包的写法。
除此之外闭包也可以在圆括号内
override func viewDidLoad() {
super.viewDidLoad()
//闭包在圆括号内
printText(parameters: {return 1})
}
func printText(parameters: () -> Int) {
print(parameters())
}
同样的,我们思考如果多个参数呢?
override func viewDidLoad() {
super.viewDidLoad()
printText(parameters:{ return 1}, parameters2:{ return 2})
}
func printText(parameters: () -> Int, parameters2:() -> Int) {
print(parameters())
print(parameters2())
}
还可以在使用尾部闭包方式,闭包体在圆括号之外。
override func viewDidLoad() {
super.viewDidLoad()
//使用尾部闭包方式,闭包体在圆括号之外
printText {return 1}
}
func printText(parameters: () -> Int) {
print(parameters())
}
同样思考一个问题,如果多个参数可以这么写?
override func viewDidLoad() {
super.viewDidLoad()
//使用尾部闭包方式,闭包体在圆括号之外
printText {return 1} parameters2: {return 2}
}
func printText(parameters: () -> Int, parameters2:() -> Int) {
print(parameters())
print(parameters2())
}
其实上面的写法对于我们return 1、return 2 这样简单的写法来说,Swift给我们提供了一个简便的写法,就是省略return关键字
override func viewDidLoad() {
super.viewDidLoad()
//在 Swift 中对闭包的用法可以进行一些简化,在这种情况下我们可以省略掉 return
printText(parameters:{ return 1}, parameters2:{ return 2})
}
func printText(parameters: () -> Int, parameters2:() -> Int) {
print(parameters())
print(parameters2())
}
Swift 除了上面这些写法以外,还给出了一个叫尾随闭包 (trailing closure)
的概念,就是把大括号拿出来,然后省略括号。如下:
override func viewDidLoad() {
super.viewDidLoad()
//使用尾部闭包方式,闭包体在圆括号之外
printText(parameters: {1}){
2
}
}
func printText(parameters: () -> Int, parameters2:() -> Int) {
print(parameters())
print(parameters2())
}
这些写法够骚吧??????其实这些都还是华而不实。因为不管哪种方式,表达上不太清晰,看起来不舒服,不够爽。于是@autoclosure就登场了。我们可以改换方法参数。在参数名前面加上@autoclosure关键字:
其实Swift升级后这句话已经有❌错了,应该是在类型前加上@autoclosure关键字。
使用如下:
override func viewDidLoad() {
super.viewDidLoad()
printText(parameters: 1, parameters2: 2)
}
func printText( parameters: @autoclosure () -> Int, parameters2: @autoclosure () -> Int) {
print(parameters())
print(parameters2())
}
是这样的!!划重点parameters: @autoclosure () -> Int
这样直接进行调用了,Swift 将会把 1 这个参数表达式自动转换为 () -> Int。这样我们就得到了一个写法简单,表意清楚的式子。
注意
@autoclosure只适用于这样的()->T无参闭包。 说句人话,就是()里面不能有其他东西。
👆就是我们说的自动闭包@autoclosure
其实与@autoclosure
相关的还有两个关键字非逃逸闭包(@noescape)和逃逸闭包(@escaping),这两个关键字在Swift3之后已经用不到了。。小编建议是可以不学了。