Swift闭包和OC中block很类似,是一段自包含的函数代码块,可以在代码中使用和传递。相当于一个匿名函数
闭包写法和演变过程
通过一个例子来说明这个问题:
func testClosure(value: Int, paramFunc: (Int) -> Int) -> String {
return String(paramFunc(value))
}
这段事例代码再简单不过了,不过我这里还是要说明下testClosure这个函数下的paramFunc参数,这个参数的类型是(Int) -> Int
(是一个返回Int,参数是Int的函数)。
最原始写法
既然paramFunc参数需要传一个(Int) -> Int
类型函数,那么就写一个函数作为参数传递,这种写法的好处就是,这个函数不仅可以在这里当参数传递,还可以在其它地方使用。
func aa(v: Int) -> Int {
return v
}
testClosure(value: 10, paramFunc: aa)
闭包写法
- 闭包完整写法
testClosure(value: 10, paramFunc: { (v: Int) -> Int in
return v * 10
})
- 尾随闭包,如果闭包是函数的最后一个参数,闭包参数可以写在参数括号外。
testClosure(value: 10) { (v: Int) -> Int in
return v * 10
}
- 闭包的一些简写方式 (无论是否是尾随闭包都可以根据下面的规则进行简写,我这里只给出了尾随闭包的省略写法实例)
- Swift可以根据上下文推理参数和返回值类型,这样返回值类型和参数类型可以省略不写。
- 如果闭包主体中是单行语句,单行语句计算结果会隐式地返回,return关键字可以省略。
- 参数和in可以去掉,闭包的参数可以通过位置来访问
// 自动推导返回值类型,参数类型
testClosure(value: 10) { v in
return v * 10
}
// return 省略了
testClosure(value: 10) { v in
v * 10
}
// 注意与函数的区别,函数是有func修饰的,而这里长的很想函数,其实不是函数,而是在调用函数
testClosure(value: 10) {
$0 * 10
}
网友评论