美文网首页
Swift 中的闭包

Swift 中的闭包

作者: 90后的晨仔 | 来源:发表于2019-02-26 23:12 被阅读0次

    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]"
    

    相关文章

      网友评论

          本文标题:Swift 中的闭包

          本文链接:https://www.haomeiwen.com/subject/textuqtx.html