Swift 中闭包如何捕获值?

2024-03-24

我正在运行下面的代码 -

class Element {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    deinit {
        print("Element is deinitializing...")
    }
}

var element: Element? = Element(name: "Silver")

var closure = {
    print(element?.name ?? "default value")
}

print(isKnownUniquelyReferenced(&element))
element?.name = "Gold"
element = nil
closure()

它打印 -

true
Element is deinitializing...
default value

上面不是闭包捕获了element强烈?如何element里面的值为零closure?


From Swift 编程指南 - 闭包 https://docs.swift.org/swift-book/LanguageGuide/Closures.html

闭包可以从定义它的周围上下文中捕获常量和变量。然后,即使定义常量和变量的原始作用域不再存在,闭包也可以在其体内引用和修改这些常量和变量的值。

闭包捕获变量,而不是变量的内容。当我们谈论函数中的局部变量(通常在堆栈上分配)时,即使函数退出并且其他局部变量被释放,它也确保它们可以访问,因此我们可以这样做:

func myFunc() {
  var array: [Int] = []

  DispatchQueue.main.async {
    // executed when myFunc has already returned!
    array.append(10)
  }
}

你的例子是类似的。闭包捕获变量。这是模块级别的变量,因此它的作用域始终存在。当你重新分配它的值时,它将影响闭包内读取的值。

或者,换句话说,闭包将相当于:

var closure = {
    print(CurrentModule.element?.name ?? "default value")
}

where CurrentModule是主模块的名称(通常是项目的名称)。

为了防止这种行为并捕获变量的值,我们可以使用关闭捕获列表。不幸的是,官方文档没有正确解释捕获列表到底是什么。基本上,使用捕获列表可以声明闭包的本地变量values创建闭包时可用。

例如:

var closure = { [capturedElement = element] in
    print(capturedElement?.name ?? "default value")
}

这将创建一个新变量capturedElement在闭包内,带有变量的当前值element.

当然,通常我们只写:

var closure = { [element] in
    print(element?.name ?? "default value")
}

这是[element = element].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中闭包如何捕获值? 的相关文章

  • 使用 UIControl (特别是 UIButton)时如何对目标进行排序?

    在我的应用程序中我有多个UIButtons我为此添加了目标 事实证明 首先执行最近添加的目标 然后执行其余的目标 例如 采用以下代码 button addTarget self action selector someAction forC
  • 关于将 Objective C 代码添加到 swift 动态框架的澄清

    我有一个 swift 动态框架 当前正在链接到另一个用 Objective C 编写的框架 这可以工作 但很烦人 因为 Objective C 框架实际上只有 2 个文件 我想知道是否有办法将其带入我的 swift框架 如果这是我会使用的应
  • 如何求一个值的n次方根?

    在 Swift 中 找到一个值的 n 次根的最简单方法是什么 我们知道数字 x 的 N 次方根相当于 x 的 N 倒数次幂 知道了这一点 我们可以使用pow求 N 次方根的函数 let nthRoot pow base 1 n where
  • Swift 中符合协议的泛型类型

    是否可以要求泛型类型的特定实例符合 Swift 中的协议 例如 假设我有一个名为的泛型类型Thing
  • AutoLayout 将 UILabel 高度设置为零

    我有一个UILabel对于其他视图中的项目描述 所有内容均使用 Interface Builder 中的约束进行布局 您可以在下图中看到所有相关约束 行数也设置为0 我没有设置高度限制 因为我想要UILabel根据其包含的文本调整大小 相反
  • iOS7上UITableViewCell显示白色背景且无法修改

    我已经实现了一个继承自的自定义表格视图单元格类UITableViewCell 表格视图包含背景图像 所以我希望单元格的背景是透明的 iOS7之前看起来很棒 然而 在 iOS7 中 单元格始终显示为白色背景 即使对于 Xcode7 2015
  • 应用程序关闭时下载报刊亭应用程序

    我正在实现一个报摊杂志应用程序 它通过 Urban Airship 推送通知接收新期刊 只要应用程序位于前台或后台 这就可以正常工作 但据我所知 当应用程序完全关闭时也应该触发下载 但发送推送 content available 1如果我的
  • AUGraph 在 iOS 上是否已被弃用?如果是的话,什么时候?

    我听到过这样的传言AUGraph在 iOS 上已被弃用 例如这篇推特帖子 https twitter com marcoarment status 878323409339338753 marcoarment 您对 atpfm 关于需要重写
  • 如何正确设置UIView的alpha? [iOS]

    I have UIView有很多子视图 UILabel UITextView 等 如果为主视图设置 alpha 0 6 则所有子视图均采用此 alpha 如何单独设置主视图的alpha view setBackgroundColor UIC
  • UISearchDisplayController 显示父 UITableViewController 的标题部分

    I am facing strange issue with UITableViewController I display search result in UISearchDisplayController If I have some
  • uiscrollview 放大和缩小无法正常工作

    我有一个 uiscrollview 里面有一个 uiimageview 我希望用户能够放大图像 因为它是一个大图像 滚动视图只需要垂直滚动而不是水平滚动 在添加缩放效果之前 我有以下代码并且它按我想要的方式工作 void viewDidLo
  • 自定义选项卡栏上的“更多”菜单

    我在我的应用程序上使用选项卡栏 UITabBarController 我希望自定义单击 更多 按钮时出现的表格的外观 我已经研究出如何通过设置来更改更多屏幕上导航栏的外观 self moreNavigationController navi
  • 如何读取 IBAction 中的 UITextField 值。我正在以编程方式创建 UITextField

    我怎样才能阅读UITextField值在IBAction 我正在创造UITextField以编程方式 所以我无法设置 property and synthesize使用 Xcode 要生成的代码UITextField如下 for i 0 i
  • 如何让 iPhone 屏幕变暗

    我的 iPhone 屏幕上有一个刷新按钮 可以刷新当前视图中的表格 屏幕刷新得很漂亮 但是有没有办法让屏幕变暗 然后在表格刷新后再次变亮 您可以在要调暗的视图上放置一个带有黑色背景的非不透明视图 默认情况下 其 alpha 值为 0 因此是
  • 重新安装我的 iPad 应用程序时,ApplicationIconBadgeNumber 未重置。

    我正在使用以下代码设置我的 applicationIconBadgeNumber UIApplication sharedApplication setApplicationIconBadgeNumber theIntToDisplay 问
  • 符号化 iPad 崩溃日志后回溯仍然不可读

    我有这些崩溃日志 在我将它们放入管理器中后 会自动进行符号化 但结果始终相同 iOS 调用得到符号化 而我的应用程序调用则没有 我尝试将 Dym 和应用程序文件复制到同一文件夹中 删除并再次复制回来 没有任何帮助 知道发生了什么事吗 所以我
  • 适用于 iOS 的 MvvmCross 汉堡菜单

    我在用着https www marcbruins nl xamarin ios hamburger menu mvvmcross https www marcbruins nl xamarin ios hamburger menu mvvm
  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat
  • 如何从 UI 测试访问 App Delegate?

    我想访问特定的属性router在 UI 测试期间从启动的应用程序的应用程序委托中获取 但我不知道这是否可行 我努力了 let appDelegate UIApplication sharedApplication delegate as A
  • 获取在 iOS UIFont 中追踪字符的路径

    假设我在 iOS 应用程序中使用了自定义字体 Foo 我已将其添加到我的项目 plist 等中 并且我能够渲染UILabels之类的就很好了 现在 如果我想找出可以 追踪 该字体中的字母 P 的点序列 我将如何获得该点序列 例如 假设我想使

随机推荐

  • 如何将“%”添加到ios-chart中的数据

    图表 这是我的代码 private func setChart pieChartView PieChartView values Double var dataEntries PieChartDataEntry let dataPoints
  • create() 生命周期钩子中的 vue 异步调用

    我需要调用下面的方法created 为此 我需要做created as async 根据 Vue 文档 created 叫做同步地 将Vue框架await on created 避免任何竞争条件 this isAuthenticated a
  • MySQL 从 CSV 数据加载 NULL 值

    我有一个文件 其中可以包含 3 到 4 列数值 这些数值以逗号分隔 空字段的定义例外 当它们位于行末尾时 1 2 3 4 5 1 2 3 5 1 2 3 在 MySQL 中创建了下表 Field Type Null Key Default
  • 将字符串拆分为行的最有效方法

    我正在使用以下函数将字符串拆分为行 它比我之前使用的函数快得多 但是我需要以某种方式更快地处理这些数据 它是一项 ETL 作业 ALTER FUNCTION dbo ArrayToTable InputString VARCHAR MAX
  • 某些字体的字符宽度计算错误,可以自动缩进

    i create a normal textbox and type some i s inside the font i use is Lobster1 3 as you can see i just selection one char
  • SwiftUI 选择器选择绑定未更新

    我正在尝试让选择器列出所有类型 称为Course然后让用户在添加新课程时选择适当的课程Assignment到托管对象上下文 选择器选择绑定 courseIndex 当用户点击选取器视图中的行时不会更新 我不完全确定如何解决这个问题 也不知道
  • 客户端无权调用此 JAX-RS EJB 错误

    我已经寻找这个问题的解决方案有一段时间了 这里是 我按照本教程从数据库自动生成 jax rs Web 服务 https netbeans org kb docs websvc rest html https netbeans org kb
  • 创建具有两个列表中的多个值的字典。将多个键组合为一个

    我有两个清单 lists a b c d e keys 18 18 3 4 5 我想要的是这样的字典 18 a b 3 c 4 d 5 e 我不断得到这个 18 a b c d e 3 a b c d e 4 a b c d e 5 a b
  • String.concat 比连接字符串的数组方法慢吗

    JavaScript 中的字符串是不可变的 通过网络和Stack Overflow 上也有 https stackoverflow com questions 51185 are javascript strings immutable d
  • C++ 当模板参数推导失败时

    为什么 C 不能确定我打算创建一个unique ptr a 用这个语法 a 之前已被声明为unique ptr a a unique ptr new A 必须包括在内似乎非常多余 a 这适用于我使用的大多数函数模板 为什么 unique p
  • 单个 LINQ 查询中生成的迭代次数

    我在使用LINQ的时候总是有一个疑问 以下代码生成了多少个迭代器 测试是一个列表 var result from t in test where t Length gt 0 t Length lt 5 orderby t 0 select
  • 在Rplot_ly中添加箱线图显着性指示线和星号

    用于向绘图添加水平显着性条形图 和星形 的 Rplot ly 命令是什么 的答案 如何绘制显着水平的箱线图 https stackoverflow com questions 29263046 how to draw the boxplot
  • C/C++波形快速显示

    我有兴趣在 Windows 和 Linux 上用 C 或 C 实现音频编辑器 我不知道如何在完全缩小的视图中足够快地显示波形 我不是在寻找有关快速帧缓冲区技术的信息 这是一个关于有效确定显示内容的算法和数据结构的问题 假设我希望能够编辑 2
  • Interface Builder 文件中的未知类。 Xcode 6 和 Swift

    我用 swift 启动了一个普通的主细节项目 如果我添加新的视图控制器并设置自定义类 则模块列表为空 并且无法选择模块 错误消息 Interface Builder 文件中存在未知类 如果我运行代码 就会出现在控制台中 如何设置故事板以了解
  • IE 中的下拉菜单隐藏在其他元素后面

    我已经在我的一个项目上安装了 site5 上的 Boldy 主题 但遇到了一个主要问题 在 Internet Explorer 8 或更低版本 中浏览时 顶部下拉菜单会显示在其他一些元素 主要内容滑块 H1 等 后面 我已经尝试了一切 从将
  • 在 Web 部署上应用 EF 迁移

    我正在使用 asp net core 2 我似乎找不到任何选项或任何关于如何将迁移应用到 Web 部署发布上的数据库的指南 这将在应用程序启动时迁移您的数据库 您可以从 Startup 类中调用它 using var context new
  • 即使应用程序关闭后,NotifyIcon 仍保留在托盘中,但在鼠标悬停时消失

    有很多问题都提出同样的疑问 解决这个问题的方法是设置 notifyIcon icon null并打电话Dispose在 FormClosing 事件中 在我的应用程序中 没有这样的表单 但有根据事件更新的通知图标 在创作时 我隐藏我的形式并
  • Kendo UI Grid - 在哪里寻找字体和图标

    我正处于学习 Kendo UI 的早期阶段 我已经完成网格工作并加载数据 但没有出现应出现在网格中的图像 图标 当我加载包含网格的页面时 出现以下 404 错误 错误消息没有告诉我期望在哪里找到这些文件 Kendo UI 在哪里寻找这些文件
  • 在悬停时添加 CSS 边框而不移动元素 [重复]

    这个问题在这里已经有答案了 我有一行在悬停时应用背景突出显示 jobs item hover background e1e1e1 border top 1px solid d0d0d0 但是 由于边框增加了 1px额外的到元素 它使其 移动
  • Swift 中闭包如何捕获值?

    我正在运行下面的代码 class Element var name String init name String self name name deinit print Element is deinitializing var elem