首页 > 其他分享 >理解 Swift 中闭包与 Objective-C 中 Block 的外部变量捕获机制

理解 Swift 中闭包与 Objective-C 中 Block 的外部变量捕获机制

时间:2024-05-10 15:23:50浏览次数:24  
标签:闭包 变量 中闭 捕获 外部 Objective Swift Block

在 Swift 中的闭包和 Objective-C 中的 Block 都支持捕获外部变量,使得在闭包或 Block 内部可以访问外部作用域的变量。本文将深入探讨它们在捕获外部变量方面的机制和区别。

1. Swift 中闭包的外部变量捕获机制

在 Swift 中,闭包捕获外部变量时会根据情况选择采用值捕获(Capture by Value)或引用捕获(Capture by Reference)的方式。

  • 值捕获: 当闭包捕获一个常量或变量时,会捕获该常量或变量的拷贝,即闭包内部使用的是外部变量的一个副本。这意味着即使外部变量的值发生改变,闭包内部使用的值也不会受到影响。

  • 引用捕获: 当闭包捕获一个引用类型的变量时(比如类实例),会捕获该变量的引用,即闭包内部使用的是外部变量的引用,而不是拷贝。这意味着闭包内部对外部变量的修改会影响外部作用域中的变量。

示例代码如下:

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var total = 0
    return {
        total += amount // 引用捕获
        return total
    }
}

let incrementByTen = makeIncrementer(forIncrement: 10)
print(incrementByTen()) // 输出 10
print(incrementByTen()) // 输出 20

在这个例子中,闭包捕获了外部变量 total 的引用,因此每次调用 incrementByTen 闭包时,都会修改外部作用域中的 total 变量。

2. Objective-C 中 Block 的外部变量捕获机制

与 Swift 不同,Objective-C 中的 Block 默认是通过引用捕获外部变量的,即闭包内部使用的是外部变量的引用。

Objective-C 中 Block 的捕获外部变量机制与 Swift 中闭包的引用捕获类似,但需要注意的是,在 Objective-C 中使用 Block 时需要手动管理内存,特别是在循环引用的情况下需要特别小心。

示例代码如下:

int base = 100;
int (^addBlock)(int) = ^(int num) {
    return num + base; // 引用捕获
};

int result = addBlock(50); // 输出 150

在这个例子中,Block 捕获了外部变量 base 的引用,因此在 Block 内部可以访问并修改 base 的值。

3. 结论

Swift 中的闭包和 Objective-C 中的 Block 在捕获外部变量方面有一些相似之处,但也存在一些不同之处。在 Swift 中,闭包可以根据情况选择值捕获或引用捕获外部变量,而在 Objective-C 中,Block 默认是通过引用捕获外部变量的。理解它们的外部变量捕获机制有助于我们更好地使用闭包和 Block,并避免出现潜在的问题。

标签:闭包,变量,中闭,捕获,外部,Objective,Swift,Block
From: https://www.cnblogs.com/PaulpauL/p/18184432

相关文章

  • SwiftUI State,Binding 状态管理
    代码////ContentView.swift//SwiftUIState////CreatedbyCHENHaoon2024/5/8.//importSwiftUIstructContentView:View{@StateprivatevarisPlaying=false@StateprivatevarclickNumber1=0@StateprivatevarclickNumber2=0......
  • swifter:加速 Pandas 数据操作
    Github地址:https://github.com/jmcarpenter2/swifter在数据科学和数据分析领域,Pandas是一个非常强大的Python库,用于数据操作和数据清洗。然而,当处理大规模数据集时,Pandas可能会变得相对较慢。这就是PythonSwifter出现的原因。本文将深入介绍PythonSwifter,它是一个用于......
  • DevTutor 一款旨在帮助开发者使用 SwiftUI 创建出色应用程序的应用
    提供可复制的代码示例和相应的用户界面预览,以简化您的编码过程。此外,还包括了《Swift编程语言》官方中英文文档的本地离线预览。主要功能■提供可直接在您的项目中使用的样本代码■实时查看您的代码如何影响应用的外观■提供官方中英文Swift编程语言离线文档■探索第......
  • SwiftUI ScrollView 滚动视图
    代码////ContentView.swift//SwiftUIScrollView////CreatedbyCHENHaoon2024/5/7.//importSwiftUIstructContentView:View{varbody:someView{VStack(alignment:.leading){VStack(alignment:.leading){......
  • SwiftUI ZStack、HStack、VStack 布局
    代码////ContentView.swift//SwiftUIStacks////CreatedbyCHENHaoon2024/5/6.//importSwiftUIstructContentView:View{varbody:someView{VStack(spacing:15){HeaderView()HStack(spacing:15){......
  • SwiftUI Image 图片处理
    代码片段////ContentView.swift//SwiftUIImage////CreatedbyCHENHaoon2024/5/6.//importSwiftUIstructContentView:View{varbody:someView{Image("paris").resizable()//延伸模式,平铺整个屏幕/......
  • SwiftUI Text 文字处理
    代码////ContentView.swift//SwiftUIText////CreatedbyCHENHaoon2024/5/6.//importSwiftUIstructContentView:View{varbody:someView{VStack{Text("Yourtimeislimited,sodon’twasteitlivingsomeoneels......
  • Paper Reading: Tri-objective optimization-based cascade ensemble pruning for dee
    目录研究动机文章贡献本文方法染色体编码适应度函数评估进化过程最终解选择级联剪枝框架实验结果数据集和实验设置三目标优化的效果不同集成规模的算法比较算法在不同数据集上的比较优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能......
  • 深入理解 Swift Combine
    Combine文中写一些Swift方法签名时,会带上label,如subscribe(_subscriber:),正常作为Selector的写法时会忽略掉label,只写作subscribe(_:),本文特意带上label以使含义更清晰。CombineFrameworkOverview在App运行过程中会发生各种各样的异步事件,如网络请求的返回,No......
  • GDExtension-Swift
    GDExtension-Swift使用Swift​编写GDExtension​步骤与使用C++​相同,根据官方文档介绍,我们使用一个由社区维护的SwiftGodot​项目。本文参考复刻社区的教程MeetSwiftGodot,并对遇到的问题进行补充。资源原版教程资料:下载实验资料本例代码仓库:https://github.com/biiigwang/go......