如何在本地闭包中调用非逃逸闭包? [复制]

2024-04-25

我有一个看起来像这样的函数:

func test(closure: () -> ()) {
    let localClosure = { closure() }

    localClosure()
}

这只是一个例子,并不能完全反映我遇到的问题,显然在这里我可以直接打电话closure直接地!

应该清楚的是,在上面的代码中,closure无法逃脱。但是,我收到错误:

闭包使用非转义参数“closure”可能会允许它转义

Now, if localClosure以某种方式逃逸,我会理解这个错误,但它并没有逃逸。我什至尝试过注释localClosure as @noescape(即使该属性在 Swift 3 中已被弃用),根据我收到的警告:

@noescape 是default并已弃用

If localClosure默认情况下,它是非转义的,那么为什么不能将另一个非转义闭包放入其中呢?或者这是编译器的错误/限制?


非参数闭包是@escaping, 默认情况下

"If localClosure默认情况下,是不可转义的,那么为什么......”

Based on the discussion in the comments below (thanks @Hamish), we can state the following facts regarding non-parameter closures in Swift 3.0:

  • 与人们可能相信的相反,它们是@escaping, 默认情况下。作为@noescape在 Swift 3 中已弃用(参见例如Xcode 8 发行说明 https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html or Swift进化提案SE-0103 https://github.com/apple/swift-evolution/blob/master/proposals/0103-make-noescape-default.md),这意味着如果不使用已弃用的方法,则无法将非参数闭包设为非转义。
  • 如中所述以下进化线索 https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160822/026711.html, 缺乏@noescape非参数闭包的属性是一项缺失的功能(有点回归,因为这不是 Swift 2.2 中的限制),但将来不一定会实现(如果我要理解 Apple dev 的答案)乔丹·罗斯(Jordan Rose)在链接进化线程中)。
  • 然而,我们可以(仍然)应用已弃用的@noescape属性为非参数闭包以使其不可转义,但随后会明显提示错误警告(如下所示,强调我的),该警告现已被 @Hamish 报告为错误,请参阅错误报告 SR-2969 https://bugs.swift.org/browse/SR-2969.

    "@noescape 是默认的并已弃用”

总而言之,localClosure is @escaping,这自然意味着不能允许包装非转义闭包参数closure of test(...).

[†] By non-parameter closures, I refer to all closures that are not parameters to a function, i.e., closures that are not supplied to a function as an argument.


作为旁注,考虑到您的问题,您可能已经知道:我们可能会自然地标记closure as @escaping如果我们希望像您的示例中那样处理/包装它。

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

如何在本地闭包中调用非逃逸闭包? [复制] 的相关文章

  • 故事板中的 Xcode 6 UIVisualEffectView

    我正在 Xcode 6 中的对象库中查找 UIVisualEffectView 以在 Storyboard 中添加模糊效果 我知道如何以编程方式执行此操作 但我找不到在故事板中执行此操作的方法 这在当前的测试版中是否不可用 或者有没有一种不
  • 前置条件失败:从 iOS 13.4 开始,在 SwiftUI 中使用 GeometryReader 时输入索引无效

    昨天 我将 XCode 和我的项目升级到 iOS 13 4 我开始在使用 GeometryReaders 的视图周围看到很多失败 除了 前提条件失败 输入索引无效 之外 该错误没有显示任何内容 升级到 13 4 1 后我遇到了完全相同的问题
  • Swift 4.2 当键盘显示时使 tableView 的底部向上移动

    尽管我已经进行了搜索 但我对如何最好地解决这个问题感到困惑 我有一个 tableView 其中底部单元格是列表的输入 就像苹果提醒的工作方式一样 当列表中的项目太多时 键盘会覆盖列表 我看不到正在输入的内容 我认为我需要更改表视图的物理大小
  • 为什么removeAllObservers()在deinit中不起作用?

    众所周知 在 iOS 中使用 Firebase 的强大功能时 每当您在视图控制器中进行观察时 var o DatabaseReference var o2 DatabaseReference var o3 DatabaseReference
  • 如何在 TextField (SwiftUI) 上添加底线

    I use Rectangle 在 TextField SwiftUI 上添加底部边框 但我想用protocol TextFieldStyle对于 TextField 样式的底线 如 RoundedBorderTextFieldStyle
  • Swift TTS,无音频输出

    我尝试在我的应用程序 TTS 中集成 但如果单击按钮 则没有音频输出 这是按钮代码 struct VocabDetailView View var body some View HStack Button Play readOut text
  • AWS ios SDK - 弹性转码器作业的 http post 请求

    查看AWS弹性转码器 有几个问题 对于我的用例来说 首先使用转码器是否具有重要价值 我正在制作一个允许用户选择视频的 ios 应用程序 当他们这样做时 我会将其上传到 S3 存储桶 据我了解 我应该使用弹性转码器对这些视频进行转码 并将它们
  • 如何快速将 Int16 转换为两个 UInt8 字节

    我有一些二进制数据 将两个字节值编码为有符号整数 bytes 1 255 0xFF bytes 2 251 0xF1 Decoding 这相当简单 我可以提取一个Int16这些字节的值 Int16 bytes 1 lt lt 8 Int16
  • 在 SwiftUI TextEditor 中设置光标位置

    有没有办法以编程方式将光标移动到特定文本行或在 SwifUI 中选择它TextEditor 例如 如果有一个TextEditor里面写着10行 当用户按下按钮时 光标将导航到第三行 或者文本将被选择 目前使用默认的 SwiftUI 是不可能
  • 为什么 'self.self' 在 swift 中编译并运行?

    昨天我回顾了 Swift 中的一段代码 其中包括这一行 self self someProperty 这让我很惊讶 因为这个词self被保留并用作对当前实例的引用 起初我用其他语言检查了这种现象 但都给出了错误 这并不奇怪 但是 为什么它能
  • 同一参数有两个不同的名称有什么意义?

    func mapEachElement inArray arr Int withFunc aFunc Int 为什么会有 inArray 然后 arr 有什么意义 对于 withFunc 和 aFunc 也是如此 它使代码变得更加复杂并且阅
  • 如何在 Swift 中检查 while 循环条件中的“nil”?

    如何检查nil在 Swift 的 while 循环中 我在这方面遇到错误 var count UInt 0 var view UIView self while view superview nil Cannot invoke with a
  • Xcode 6 代码编辑器异常行为

    截至最近 我在使用 Xcode 6 代码编辑器时遇到了一些麻烦 最终导致编辑窗口中的焦点快速变化 在编辑文本时跳转到同一文件中完全不同的位置 一切就是这样开始的 最近 编辑器拒绝上下滚动 挂起 停止显示行号或任何其他文本 我该怎么做才能让它
  • UITableView 自动调整行大小约束在 iPhone 6Plus 上神秘破坏

    我有一个自定义的 UITableViewCell 它有一个缩略图和一堆文本 行高配置为使用自动计算 tableView estimatedRowHeight 129 tableView rowHeight UITableViewAutoma
  • Swift 为 .toInt 提供Optional(3) 而不是 3

    尝试从字段中提取数字并继续获取可选 数字 而不是数字 IBOutlet weak var years UITextField IBAction func calculateYear sender AnyObject var a years
  • NSAttributedString 和表情符号:位置和长度问题

    我正在使用 NSAttributedString 对来自 API 的文本的某些部分 如 Twitter 上的 mention 进行着色 API 为我提供了文本和代表文本中应着色的部分 或链接 标签等 的实体数组 但有时 颜色会因为表情符号而
  • 无法实现模块模式

    我正在尝试重现 Douglas Crockford 所著的 Javascript The Good Parts 一书中的一些代码 这个想法是使用闭包进行对象封装并避免Javascript固有的全局变量 var serial maker fu
  • 如何将计算值转换为文字以进行枚举初始化

    我遇到了枚举的问题 因为我想将 case 初始化为双精度值PI 180 有没有办法通过常量或一些时髦的魔法获取这个计算值并将其转换为文字 以便我可以初始化枚举 我宁愿不必做3 14 我宁愿使用该值的实际编译器和硬件计算表示 所以我的第一次尝
  • 无法转换“String”类型的值?预期参数类型“URL”

    我正在尝试从主包中的文件加载数据 当我使用这段代码时 let path Bundle main path forResource abc ofType txt let dataTwo try Data contentsOf path err
  • 如何在 Swift 中解析蓝牙设备发送的浮点数?

    在我的 iOS 应用程序上 我需要解码蓝牙接收到的 Float 值 并从不同的设备 不是 iOS 获取 4 个字节 因此我需要一个 便携式 4 字节 Float 格式 目前发件人正在使用以下格式 数据编码 0xCCBBAAAEE 0xEE

随机推荐

  • 将 clang-format 与 C++/CLI“针对每个”一起使用

    我目前尝试使用格式化 C CLI 代码clang 格式 版本 9 0 0 我不知道如何处理for each声明 Before for each auto i in I 之后 例如 Visual Studio 中的 CTRL K CTRL D
  • Windows 10 WSL - Maven 配置

    有没有办法配置 Windows Maven 和 WSL Maven 以使用相同的 m2 repository and settings xml In my bashrc从 WSL 我添加了M2 HOME使用与 Windows 10 相同的安
  • 通过平移手势或拖动更改视图 Alpha

    我想要一个 UIView 在平移手势上拖动到屏幕底部 但当它到达屏幕底部时 视图 alpha 应该缩小到 零 反之亦然 当我向上拖动视图时 UIView alpha 应缩小到 1 但问题是视图的 Alpha 缩小到 零 平移一半屏幕时或有时
  • 如何使用新的流 API 在 Dart 中注册自定义事件

    我正在尝试注册 CustomEvent https developer mozilla org en US docs DOM Event CustomEvent https developer mozilla org en US docs
  • 原始数据转JPEG格式-JAVA

    我尝试使用 JPEGEncoder 将原始数据 ByteArray 转换为 JPEG 格式 但在移动设备上速度太慢 我已经在移动设备上测试过 我怎样才能在java中做同样的事情 我将把原始数据字节发送到java并用java将其编码为JPEG
  • 如何解密Lua字节码?

    早上好 我正在尝试破译 Moon 字节码 但我无法以任何方式 有人可以帮助我吗 我有这个 例如 code 27 76 117 97 81 0 1 4 4 4 8 0 如何将此字节码解密为文本 我已经在这里搜索 http www asciit
  • 如何使用unix“find”命令查找所有cpp和h文件?

    我知道要找到所有 h我需要使用的文件 find name h 但如何找到所有 h AND cpp files find name h print o name cpp print or find name h o name cpp prin
  • 应该是 WebAPI 还是 asmx

    我应该为我的两个简单 API 使用 ASMX 服务还是 ASP NET Web API 我想在我的 ASP NET MVC 项目中创建两个简单的 API 一个接受 3 个参数 currentUserID DataType ActionNam
  • C# 中的类型与强类型

    在 C 中 有什么理由说强类型与只是typed 当有人说类型化类时 我想到的是对象以外的某种类型 除了 object 之外 几乎所有内容都是用 C 编写的 一旦定义了一个不是对象的类 该类就是一种类型 不再从那里输入它 顺便说一句 这不是关
  • 为什么两个字符串文字相加不使用operator+?

    编辑 我已经重新格式化了帖子以使其更加清晰 为什么这有效 struct A struct B B A void operator const B const B int main A a1 a2 a1 a2 而这不 struct B B c
  • 排序数组中的最小成本路径

    给定一个排序数组A e g 4 9 10 11 19 搬家费用i gt j is abs A j A i 从给定元素开始 例如10 找出成本最低的路径 而无需两次访问同一元素 所以在这个例子中解决方案是10 gt 9 gt 4 gt 11
  • 将图像裁剪或遮罩成圆形

    使用 ImageMagick 或 GD 库将图像裁剪或遮罩成圆形形状的最佳方法是什么 请注意 解决方案存在于 其他 问答网站上 但不存在于 StackOverflow 上 这是使用 ImageMagick 的一种方法 无需使用遮罩即可实现此
  • Python 中的归一化互相关

    最近几天我一直在努力计算两对向量 x和y 的自由度 参考Chelton 1983 它是 根据 Chelton 1983 的自由度 https i stack imgur com O0DqE png 我找不到使用 np correlate 计
  • 像随机关卡生成一样自由流动,只有一种可能的解决方案?

    我已经实现了在这个问题中标记为正确答案的算法 流畅类游戏随机关卡制作用什么 https stackoverflow com questions 12926111 what to use for flow free like game ran
  • 在 Uvicorn/FastAPI 内发出下游 Https 请求的正确方法是什么?

    我有一个 API 端点 FastAPI Uvicorn 除此之外 它还向另一个 API 请求信息 当我使用多个并发请求加载 API 时 我开始收到以下错误 h11 util LocalProtocolError can t handle e
  • 如何在创建后将 VB.NET DataTable 列定义为主键

    我正在使用 VB NET dataAdapter 从 Oracle 数据库导入表 我使用 fill 命令将导入的数据添加到数据集中 在 DataTable 已填充数据后 如何将 DataTable 的特定列定义为 PrimaryKey 只要
  • 灵活地将新数据附加到 yaml 文件

    我有不同的 yaml 文件 它们可能具有不同的嵌套结构 文件1 yaml test3 service1 name1 somedata name2 somedata 文件2 yaml test1 app1 app2 somedata app7
  • 在远程服务器上执行 rake 任务

    生产环境的物理架构包括多台执行不同作业 rake 任务 的机器 所有这些机器都在同一个数据库上 其中一项工作将完成大量工作UPDATE如果其他作业正在运行 则通常会返回 postgres 死锁的表 我已经有一个 rake 任务来正常停止其他
  • 如何对字符串进行拼写检查?

    有人知道 C 多语言拼写检查库吗 我不需要实时拼写检查 仅检查字符串 thanks 就其价值而言 这是谷歌上的第一个点击 SpellCheck http msdn microsoft com en us library system win
  • 如何在本地闭包中调用非逃逸闭包? [复制]

    这个问题在这里已经有答案了 我有一个看起来像这样的函数 func test closure gt let localClosure closure localClosure 这只是一个例子 并不能完全反映我遇到的问题 显然在这里我可以直接打