首页 > 其他分享 >iOS Swift 里的捕获变量

iOS Swift 里的捕获变量

时间:2024-10-17 15:44:47浏览次数:6  
标签:闭包 变量 外部 Swift 捕获 iOS total ref

在 Swift 中,闭包不仅可以作为函数的简洁表达方式,还能捕获和存储其所在上下文中的常量和变量。捕获的变量会随着闭包的生命周期延续,即使这些变量已经超出了原作用域,它们仍然可以在闭包中被访问和修改。这种行为被称为闭包捕获,是闭包的核心特性之一。

//变量值捕获

func makeIncrementer() -> () -> Int {
    var total = 0  // 这是外部变量
    let incrementer: () -> Int = {
        total += 1  // 闭包捕获了外部变量 total
        return total
    }
    return incrementer
}

let increment = makeIncrementer()
print(increment())  // 输出 1
print(increment())  // 输出 2
// 在这个例子中,total 变量是在 makeIncrementer 函数内定义的,它对 incrementer 闭包来说是“外部”的。但由于闭包捕获了这个外部变量,total 可以在闭包内部被修改和访问。

 

//引用类型捕获

class ReferenceType {
    var value: Int = 0
}
func referenceClosure() -> () -> Int {
    let ref = ReferenceType()//函数内声明了一个局部变量 
    let closure: () -> Int = {
        ref.value += 1 //闭包内修改外界变量
        return ref.value
    }
    return closure
}

let closureRef = referenceClosure()
print(closureRef()) // 输出 1
print(closureRef()) // 输出 2
//closure 是一个闭包,它捕获了 ReferenceType 的实例 ref。这个 ref 是 referenceClosure 函数中的局部变量,但由于被闭包捕获,在 referenceClosure 返回后,ref 仍然存在于闭包中,并且它的 value 属性可以继续被修改。

 

为什么闭包要捕获外部变量?

闭包需要捕获外部变量,主要是为了保持它们的状态,即使闭包所在的作用域已经结束。

 

  • 如果一个变量定义在函数内部,但闭包捕获了它,该变量就不会随着函数的结束而销毁。闭包可以长期持有该变量的引用,并在后续调用时继续使用它。
  • 闭包内部变量:是在闭包的代码块内部定义并使用的变量,通常只能在闭包内访问。
  • 外部变量:是在闭包所在的作用域(函数或其他代码块)中定义,但被闭包引用的变量。由于它们是在闭包外部定义的,所以称为“外部变量”。

标签:闭包,变量,外部,Swift,捕获,iOS,total,ref
From: https://www.cnblogs.com/someonelikeyou/p/18472454

相关文章

  • 如何用axios发送ajax请求(函数)
    在上篇文章的基础上将格式改为:btns[2].onclick=function(){axios({//请求方法method:'POST',url:'/axios-server',params:{vip:10,......
  • Dell-switch ios升级
    Dell-switchios升级1.showbootsystemstack-unitall查看目前ios的版本2.上传ios到A和B分区DellEMC#upgradesystemtftp:A:Addressornameofremotehost[]:172.29.8.33Sourcefilename[]:FTOS-Z9100-ON-9.14.1.5.binDellEMC#upgradesystemtftp:B:Addressor......
  • iOS Swift 函数的可变参数
    一可变参数在Swift中,可变参数(VariadicParameters)允许函数接受不定数量的参数。你可以在函数定义时通过在参数类型后面加上...来声明可变参数。funcsum(numbers:Int...)->Int{vartotal=0fornumberinnumbers{total+=number}ret......
  • AudioSource
    目录简介字段说明简介AudioSource附加到GameObject,用于在3D环境中播放声音。要播放3D声音,还需要一个AudioListener。音频监听器通常附加到要使用的摄像机。声音以3D还是2D方式播放由AudioImporter设置决定。可以使用Play、Pause和Stop播放单个音频剪辑。也可以使......
  • 使用 Swift 实现图标点选验证码识别及分割
    Swift是一门现代化的编程语言,广泛应用于iOS和macOS开发中。借助第三方图像处理库,Swift也能够高效地完成验证码图像的识别和分割。本文将演示如何使用Swift语言实现图标点选验证码的识别与分割。环境准备在macOS系统中,使用Swift是非常方便的。我们可以通过CocoaPods......
  • iOS Swift 集合类型 (Array、Set 和 Dictionary ) 与 元组
    语言提供数组(Array)、集合(Set)和字典(Dictionary)三种基本的集合类型用来存储集合数据。数组是有序数据的集。集合是无序无重复数据的集。字典是无序的键值对的集。Swift中的数组、集合和字典必须明确其中保存的键和值类型,这样就可以避免插入一个错误数据类型的值。同理,对于获......
  • (IOS)VMware虚拟机上安装win10系统(超详细)
    简介虚拟机是一种软件实现的计算机系统,可以在现有的操作系统平台上运行一个或多个虚拟的操作系统。它通过在主机操作系统上创建一个虚拟的硬件平台,并在其上运行一个完整的操作系统,来模拟一个真实的物理计算机。虚拟机可以提供一种隔离的环境,使得不同的操作系统和应用程序可以......
  • Swift中Themeable
    在Swift中,Themeable协议通常用于创建可以根据主题变化而改变外观的对象,比如UI组件、视图控制器等。通过实现这个协议,你可以为你的应用提供主题切换的功能,使其在不同的视觉风格下仍然保持一致性。定义Themeable协议一个简单的Themeable协议可能如下所示:protocolThemea......
  • swiftformat.yaml字段释义
    swiftformat.yaml文件是用来配置SwiftFormat的格式化规则和选项。以下是各个字段的详细说明:Rules(规则)blankLinesAroundMark:在标记(如#pragmamark)前后添加空行。blankLinesAtEndOfScope:在作用域末尾添加空行。blankLinesAtStartOfScope:在作用域开始处添加空行。......
  • 部分品牌电脑进入BIOS方法
    今天来分享一下,部分品牌电脑如何进入bios的方法戴尔(Dell):F2键惠普(HP):F2键或F10键联想(Lenovo):F2键或Fn+F2键(部分机型)宏碁(Acer):F2键华硕(ASUS):F2键微星(MSI):Delete键苹果(Apple):搭载Intel芯片的Mac:Option键搭载AppleSilicon芯片的Mac:长按Command+Option+R进入BIOS的通用步骤关闭电......