####1.什么是闭包?
#### 在苹果给出的官方文档上给出了这样的一段代码,我觉得对理解闭包有很大的帮助。
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen()
分析:从代码来看:
(1)、一个函数中嵌套了另外一个函数。
(2)、嵌套的内部函数可以访问外部函数的变量。
(3)、在函数的外部却无法访问函数内的变量。
#总结:对象一级一级地向上寻找父对象的变量,父对象的所有变量,对子对象都是可见的,反之则不可见,这样的一个"链式作用域"结构就是闭包。
####2.闭包的特点有哪些?
- 函数可以嵌套函数,嵌套的函数可以访问外部函数中声明的变量。
- 函数可以返回另一个函数作为其值。
func makeIncrementer() -> ((Int) -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
- 函数可以将另一个函数作为其参数之一。
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)
####3.闭包的用途
分析到这里我们不难看出:函数实际上是闭包的一种特殊情况,所以也可以这样简单的理解
<1、闭包就是一个桥梁,它将内部函数和外部函数连接起来,然后可以读取函数内部的变量。
<2、闭包可以延长变量的生命周期。
####4.闭包注意事项
#####.1)闭包会使函数中的变量都被保存在内存中,会有内存消耗、所以希望能够在刀尖上使用它吧。
#####.2)闭包会在父函数外部,改变父函数内部变量的值。所以使用时候需要谨慎一些。
####5.闭包的几种特殊形式
(1).匿名闭包({})
numbers.map({ (number: Int) -> Int in
let result = 3 * number
return result
})
(2)、当已知闭包的类型(例如委托的回调)时,可以省略其参数的类型,返回类型或两者。单个语句闭包隐式返回其唯一语句的值。
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
// Prints "[60, 57, 21, 36]"
(3)、您可以按编号而不是按名称引用参数 - 这种方法在非常短的闭包中特别有用。作为函数的最后一个参数传递的闭包可以在括号后面立即出现。当闭包是函数的唯一参数时,可以完全省略括号。
let sortedNumbers = numbers.sorted { $0 > $1 }
print(sortedNumbers)
// Prints "[20, 19, 12, 7]"