首页 > 其他分享 >闭包捕获值

闭包捕获值

时间:2023-03-10 15:31:37浏览次数:28  
标签:闭包 runingTotal incrementBySeven incrementByTen Int 捕获 incrementer


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

//: 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()

闭包是引用类型

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

 

标签:闭包,runingTotal,incrementBySeven,incrementByTen,Int,捕获,incrementer
From: https://blog.51cto.com/u_14523369/6113222

相关文章

  • Python 异常捕获与处理
    异常捕获和处理一、基础知识1、什么是异常当我们写程序难免遇到报错,专业的称呼叫做异常,行业俗语叫做bug,由于异常情况出现会导致代码停止运行,所以在编写过程中要尽可能避......
  • celery task 异常捕获的两种方式.(sentry, mail)
    捕获celerytask异常的两种方式,sentry,mailsentry(sentry记录异常.)importsentry_sdkfromsentry_sdk.integrations.celeryimportCeleryIntegrationsentry_......
  • c++ lambda表达式捕获类数据…
    lambda表达式允许捕获局部变量,但是数据成员不是局部变量。用一种特殊的方法,你可以捕获“this”:。usingnamespacestd;classKitty{public:explicitKitty(inttoys)......
  • 07:swift-闭包
    复习 正文/*7:闭包1:**闭包能够捕获和存储定义在其上下文中的任何常量和变量的引用,这也就是所谓的闭合并包裹那些常量和变量,因此被称为“闭包”.Swif......
  • 5.闭包的实现原理和作用,可以列举几个开发中闭包的实际应用
    1.闭包的实现原理和作用闭包:指有权访问另一个函数作用域中的变量的函数,一般都是一个函数包含另一个函数。2.闭包的作用:访问函数内部变量、保持函数在环境中一直存在,不会......
  • go的闭包捕获变量
    packagemainimport( "fmt")funcA()int{ variint deferfunc(){ i++ fmt.Println("deferfuncA",i) }() fmt.Println("funcA",i) returni}func......
  • 重要内置函数、常见内置函数(了解)、可迭代对象、迭代器对象、for循环原理、异常捕获
    目录一、重要内置函数二、常见内置函数(了解)三、可迭代对象四、迭代器对象五、for循环内部原理六、捕捉异常一、重要内置函数1.zip说白了就是压缩几组数据值,说细了......
  • 代理异常捕获
    背景在某些场景,比如过滤器,拦截器,或者某些代理类的时候,ControllerAdvance是捕获不到异常的方案:使用springmvc框架,让程序直接导入进来//验证etbc登录try{......
  • Groovy-正则捕获,Http请求和写入文件
    示例:<!--FontAwesome--><linkhref="static/font-awesome/4.7.0/css/font-awesome.min.css"rel="stylesheet"><!--Ionicons--><linkhref="stat......
  • 深入变量和闭包
    加var变量和不加var变量的区别加var的变量都会提升,不管代码执行与否,不加var的变量预编译阶段不会提升原型链和作用域链window.a//不会报错返回undefined......