认识闭包
是一个函数类型实例,一段自包含的代码块,可被用于函数类型的变量\参数\返回值
匿名函数(没有名字的函数)
类似于 OC 中的 block
三种闭包的形式:全局函数\嵌套函数\闭包表达式
//闭包表达式
rects.sort({ (first:Rectangle, second:Rectangle)->Bool in
return first.width*first.length<=second.width*second.length
})
闭包是引用类型,闭包变量拷贝具有引用语义
闭包和函数类型实例具有同样的内存模型
14607083327736.jpg闭包表达式
1.完整形式:
函数{(参数名1:参数类型1,参数名2:参数类型2...)->返回值类型 in
语句块
return 返回值
}
2.自动类型推断:省略参数类型和返回值类型
函数({ 参数名1, 参数名2 in
语句块
return 返回值
})
3.单表达式闭包:省略 return 关键词
函数({ 参数名1, 参数名2 in 语句块})
4.参数缩略形式$0,$1:省略参数声明和 in
//参数缩略形式
函数({$0 > $1})
5.操作符函数自动推导为函数类型
//操作符缩略式
函数( > )
6.尾随闭包:闭包的表达式为函数的最后一个参数,可放在后面(没有参数可以省略()括号)
函数[()]{ 参数名1, 参数名2 in 语句块}
7.自动闭包:不接受任何参数
var cities = ["Beijing", "Shanghai", "New York", "Paris", "London"]
let filter = { cities.removeLast() } //没有执行,延迟计算
//let filter = cities.removeLast() //执行
函数类型和闭包的变量捕获
- 函数类型和闭包可以捕获上下文任何值
- 如果捕获值生存周期小于闭包对象,系统将捕获值封装在临时对象里
- 临时对象和闭包对象之间是强引用关系,生存周期跟随闭包对象
//捕获实例属性
class Rectangle{
var width=0
var length=0
static var max=100
init(width:Int, length:Int){
self.width=width
self.length=length
}
func getComputeHandler()->() -> Int{
return {
return self.width*self.length//捕获
}
}
}
//捕获参数或局部变量
func addHandler(step: Int) -> () -> Int {
var sum = 0
return {
sum += step //捕获了 sum 和 step
sum += 1
return sum
}
}
网友评论