Swift 中的闭包

####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]"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值