函数是闭包的一种,类似于OC语言的block,闭包用来定义函数,作用同Block相同,一般用于耗时操作,闭包表达式(匿名函数) -- 能够捕获上下文中的值
语法: in关键字的目的是便于区分返回值和执行语句
闭包表达式的类型和函数的类型一样, 是参数加上返回值, 也就是in之前的部分
{
(参数) -> 返回值类型 in
执行语句
}
// 完整写法
let say:(String) -> Void = {
(name: String) -> Void in
print("hi \(name)")
}
say("lnj")
// 没有返回值写法
let say2:(String) ->Void = {
(name: String) in
print("hi \(name)")
}
say2("lnj")
// 没有参数没有返回值写法
let say3:() ->Void = {
print("hi lnj")
}
say3()
闭包表达式作为回调函数 实现冒泡排序(可以自定义升序和降序)
/*
闭包表达式作为回调函数 实现冒泡排序
*/
func bubbleSort(array: inout [Int], cmp: (Int, Int) -> Int)
{
for _ in array {
for j in 0..<array.count-1{
if cmp(array[j], array[j + 1]) == -1{
let temp = array[j]
array[j] = array[j + 1]
array[j + 1] = temp
}
}
}
}
//调用
var arr_ = [ -10,20,4,5,2,10]
bubbleSort(array: &arr_) { (a: Int, b: Int) -> Int in
if a > b{
return 1;
}else if a < b
{
return -1;
}else
{
return 0;
}
}
print("排序后:",arr_)
如果闭包是最后一个参数, 可以直接将闭包写到参数列表后面, 这样可以提高阅读性. 称之为尾随闭包.
闭包循环引用问题
同Block一样,闭包也存在循环引用问题,常用的self引起的可以用下面的处理方法:
weak var weakSelf = self
weakSelf!.view
网友评论