闭包捕获值

一个闭包能够从上下文捕获已被定义的常量和变量, 即使定义这些常量和变量的原作用域已经不存在,闭包仍能够在其函数体内引用和修改这些值

//: A UIKit based Playground for presenting user interface

import UIKit

func makeIncrementer(forIncrement amount:Int)->()->Int{
    var runingTotal=0
    func incrementer()-> Int{
      runingTotal += amount
        return runingTotal
    }
    return incrementer
}

作为一种优化,如果一个值没有改变或者在闭包的外面,Swift可能会使用这个值的copy而不是捕获,

Swift也处理了变量的内存管理操作,当变量不再需要时会被释放

//: A UIKit based Playground for presenting user interface

import UIKit

func makeIncrementer(forIncrement amount:Int)->()->Int{
    var runingTotal=0
    func incrementer()-> Int{
      runingTotal += amount
        return runingTotal
    }
    return incrementer
}

let incrementByTen=makeIncrementer(forIncrement:    10)
incrementByTen()
incrementByTen()
incrementByTen()
incrementByTen()
incrementByTen()

如果你建立了第二个incrementer它将会有一个新的、独立的runingTotal变量的引用

//: A UIKit based Playground for presenting user interface

import UIKit

func makeIncrementer(forIncrement amount:Int)->()->Int{
    var runingTotal=0
    func incrementer()-> Int{
      runingTotal += amount
        return runingTotal
    }
    return incrementer
}

let incrementByTen=makeIncrementer(forIncrement:    10)
incrementByTen()
incrementByTen()
incrementByTen()
incrementByTen()
incrementByTen()
let incrementBySeven=makeIncrementer(forIncrement:    7)
incrementBySeven()
incrementBySeven()
incrementBySeven()
incrementBySeven()
incrementBySeven()

 闭包是引用类型

在swift中,函数和闭包都是引用类型

无论你在什么时候赋值一个函数或者闭包给常量或者变量,你实际上都是将常量和变量设置为对函数和闭包的引用

//: A UIKit based Playground for presenting user interface

import UIKit

func makeIncrementer(forIncrement amount:Int)->()->Int{
    var runingTotal=0
    func incrementer()-> Int{
      runingTotal += amount
        return runingTotal
    }
    return incrementer
}

let incrementByTen=makeIncrementer(forIncrement:    10)
incrementByTen()
incrementByTen()
incrementByTen()
incrementByTen()
incrementByTen()
let incrementBySeven=makeIncrementer(forIncrement:    7)
incrementBySeven()
incrementBySeven()
incrementBySeven()
incrementBySeven()
incrementBySeven()

let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()

闭包是引用类型

如果你分配了一个闭包给类实例的属性,并且闭包通过引用该实例或者它的成员来捕获实例,你将在闭包和实例间会产生循环引用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值