(一)什么是闭包?
闭包和函数一个概念,是一致的,之外还有自己的特性.
arr.sort() //传一个闭包和传一个函数 是一个结果. 看如下代码:
准备一个数组:
var arr:[Int] = []
for _ in 0...10{
arr.append(random()%1000)
}
传一个函数例子:
先定义一个函数
func biggerNumberFirst(a:Int,_ b:Int)->Bool{
return a > b
}
调用函数
var newArray = arr.sort(biggerNumberFirst)
传一个闭包:
arr.sort({
(a:Int,b:Int)->Bool in
return a>b
})
(二)闭包的简写方式
还有几种简写方式:
一种:由于在sort方法的声明中,函数的参数类型和返回值类型都已经被定义了.
arr.sort({a,b in return a>b})
一种:由于sort方法中已经规定了必须有返回值,而且我们的返回只有一行代码,就可以写成下面这种形式
arr.sort({a,b in a>b})
一种使用swift提供的默认变量形式
arr.sort({$0>$1})
还有一种是:在swift中,><号 就是一种函数
arr.sort(>)
当闭包是这个方法的最后一个参数:可以简写成
var newarr = arr.sort (){ (a, b) -> Bool in
return a>b
}
当闭包是这个方法的最后一个参数,且只有一个闭包参数的时候:函数名后面的小括号也可以省略,可以简写成
var newarr = arr.sort{ (a, b) -> Bool in
return a>b
}
(三)闭包的特性---内容捕获
var num = 700
arr.sort {
a, b in
abs(a-num) < abs(b-num)
}
基本数据类型,在闭包中的内存问题,不会有什么问题.
(四)闭包和函数是引用类型.
定义一个返回函数的一个函数.
func runningMetersWithMetersPerDay(metersPerDay:Int) -> ()->Int {
var totalMeters = 0
return {
totalMeters += metersPerDay
return totalMeters
}
}
var planA = runningMetersWithMetersPerDay(100)
planA() //100
planA() //200
var anoterPlan = planA //在这里将函数赋值给了另外一个变量 从下面结果看,其实也就是给变量起了另外一个名字.anoterPlan.不管调用哪个,都是后面指定的内存起作用.
anoterPlan() //300
planA() //400