美文网首页
swfit Block 捕获值 与 闭包是引用类型

swfit Block 捕获值 与 闭包是引用类型

作者: json_jie | 来源:发表于2017-08-10 16:10 被阅读28次
  1. 捕获值
  2. 闭包可以在其定义的上下文中捕获常量或变量
  3. 即使定义这些常量和变量的原域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。
  4. Swift最简单的闭包形式是嵌套函数,也就是定义在其他函数的函数体内的函数
  5. 嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量。
  6. 看这个例子:
  7. func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    
  8. 一个函数makeIncrementor ,它有一个Int型的参数amout, 并且它有一个外部参数名字forIncremet,意味着你调用的时候,必须使用这个外部名字。返回值是一个()-> Int的函数。
  9. 函数题内,声明了变量runningTotal 和一个函数incrementor。
  10. incrementor函数并没有获取任何参数,但是在函数体内访问了runningTotal和amount变量。这是因为其通过捕获在包含它的函数体内已经存在的runningTotal和amount变量而实现。
  11. 由于没有修改amount变量,incrementor实际上捕获并存储了该变量的一个副本,而该副本随着incrementor一同被存储。
  12. 所以我们调用这个函数时会累加:
  13. import Cocoa
    
    func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    
    let incrementByTen = makeIncrementor(forIncrement: 10)
    
    // 返回的值为10
    print(incrementByTen())
    
    // 返回的值为20
    print(incrementByTen())
    
    // 返回的值为30
    print(incrementByTen())
    
  14. 以上程序执行输出结果为:
  15. 10
    20
    30
    

  16. 闭包是引用类型
  17. 上面的例子中,incrementByTen是常量,但是这些常量指向的闭包仍然可以增加其捕获的变量值。
  18. 这是因为函数和闭包都是引用类型。
  19. 无论您将函数/闭包赋值给一个常量还是变量,您实际上都是将常量/变量的值设置为对应函数/闭包的引用。 上面的例子中,incrementByTen指向闭包的引用是一个常量,而并非闭包内容本身。
  20. 这也意味着如果您将闭包赋值给了两个不同的常量/变量,两个值都会指向同一个闭包:
  21. import Cocoa
    
    func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    
    let incrementByTen = makeIncrementor(forIncrement: 10)
    
    // 返回的值为10
    incrementByTen()
    
    // 返回的值为20
    incrementByTen()
    
    // 返回的值为30
    incrementByTen()
    
    // 返回的值为40
    incrementByTen()
    
    let alsoIncrementByTen = incrementByTen
    
    // 返回的值也为50
    print(alsoIncrementByTen())
    
  22. 以上程序执行输出结果为:
  23. 50
    

http://www.runoob.com/swift/swift-closures.html

相关文章

  • swfit Block 捕获值 与 闭包是引用类型

    捕获值 闭包可以在其定义的上下文中捕获常量或变量 即使定义这些常量和变量的原域已经不存在,闭包仍然可以在闭包函数体...

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • 闭包

    闭包 本节内容包括: 闭包表达式 尾随闭包 值捕获 闭包是引用类型 Swift 中的闭包与 C 和 Objecti...

  • Swift Tour Learn (五) -- Swift 语法

    本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

  • swift-闭包

    闭包 ≈ block, 函数, 匿名函数 (闭包和函数都是引用类型,能改变值)(值类型不能改变值) 对上面的传的函...

  • 闭包(Closures)

    目录 闭包表达式 尾随闭包 值捕获 闭包是引用类型 逃逸闭包 闭包采取如下三种形式之一 “全局函数是一个有名字但不...

  • swift底层探索 09 - Block捕获外界变量原理

    本文中分析两个问题:1. Block闭包是一个引用类型2. Block捕获外部变量 1、Block结构 1.1 I...

  • 闭包

    闭包的基本语法 闭包的内容捕获 闭包和函数的引用类型

  • js读书笔记

    js原始值类型 引用类型。对象与数组可以包含对象与数组,json的基础。装箱 拆箱值到引用与引用到值。闭包是根据定...

网友评论

      本文标题:swfit Block 捕获值 与 闭包是引用类型

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