闭包是可以在代码中传递和使用的自包含的功能模块。可以捕获和存储上下文任何引用常量和变量,也就是关闭这些常量和变量,因此得名“闭包。相当于java 中的匿名内部类、OC中的block。
可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。
闭包表达式语法:
{(参数列表)->返回值类型 in
语句组
}
闭包的参数可以使用 常量 、变量、元组和输入输出参数(inout),不提供默认值,参数列表中的最后一个参数,也可以使用可变参数。
in 关键字 引入内联闭包的函数体,表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。
多返回值,可以借助元组。
闭包作为函数参数的事例:
/**
参数1:Int 数组
参数2:是一个函数类型的参数
返回值:Int 数组
*/
func getArr(arr:[Int] , pre:(Int)->Bool) ->[Int]{
//定义一个空的可变整形集合
var tempArr = [Int]()
for temp in arr {
if pre(temp){
tempArr += [temp]
}
}
return tempArr;
}
/**** 调用函数 ******/
//定义int数组
var intArr = [0,1,2,3,4,5,6]
/**调用 getArr 函数 ,其中第二个参数为闭包*/
var result = getArr(intArr, pre: {(s:Int)-> Bool in
return s>2
})
print(result)
//[3, 4, 5, 6]
闭包的简化方式:
1,类型推断简化
因为 Swift 可以推断出闭包的参数和返回值类型,所以不需要完整格式构造内联闭包。
上面的闭包就可以简写为:
{s in
return s>2
}
2,隐藏return 关键字
如果 闭包内只有一条 return 语句时,可以省略return 关键字,所以上面的闭包还可以在简化为:
{s in s>2}
3,参数名缩写
Swift 为内联函数提供了参数名称缩写功能,通过 $0,$1,$2 顺序使用闭包的参数。
如果使用了参数缩写名称,在函数参数列表中可以省略对闭包的定义,Swift 也会推断闭包参数缩写名称的类型。 in 关键字同样被省略。此时闭包表达式完全由闭包函数体构成。上面的闭包再简化为:
{$0 > 2}
使用闭包的返回值:
闭包表达式的运算结果是函数类型,是有返回值的,所以我们可以直接使用它的返回值
var add = { (str1:String,str2:String) -> String in
return str1+str2
}("hello","word")
print(add)
var add2 = {$0 + $1}("hello","word")
print(add2)
//helloword
//helloword
使用 闭包的返回值,需要在闭包表达式的后面加上小括号(),给闭包传递参数。然后将返回值,赋值给变量add.
尾随闭包
闭包作为函数的参数,而且闭包表达式有很长的情况下,调用函数时,代码的可读性就变的很差,为了增强代码的可读性,这里就需要用到 尾随闭包。就是将闭包写在参数列表括号的后面。
需要注意的是,闭包必须是函数参数列表的最后一个参数。
使用尾随闭包调用上面的 getArr 函数
var result1 = getArr(intArr){(s:Int)-> Bool in return s>2} //尾随闭包
var result2 = getArr(intArr){s in return s>2} //闭包类型推断简化
var result3 = getArr(intArr){s in s>2} //尾随闭包影藏return
var result4 = getArr(intArr){$0>2} //尾随闭包参数名缩写