swift – 如何在本地闭包内调用非转义闭包?

swift – 如何在本地闭包内调用非转义闭包?,第1张

概述参见英文答案 > Why do closures require an explicit `self` when they’re all non-escaping by default in Swift 3?                                    2个 我有一个看起来像这样的函数: func test(closure: () -> ()) { let loc 参见英文答案 > Why do closures require an explicit `self` when they’re all non-escaping by default in Swift 3?                                    2个
我有一个看起来像这样的函数:

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

这只是一个例子,并没有完全反映我遇到的问题,显然在这里我可以直接调用封闭!

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

Closure use of non-escaPing parameter ‘closure’ may allow it to escape

现在,如果localClosure以某种方式转义,我会理解这个错误,但它不会逃脱.我甚至尝试将localClosure注释为@noescape(即使该属性在Swift 3中已弃用),并根据我得到的警告:

@noescape is the @H_404_30@default and is deprecated

如果localClosure在默认情况下是非转义的,那么为什么另一个非转义闭包不能进入呢?或者这是编译器的错误/限制?

解决方法 默认情况下,非参数闭包是@escaPing

“If localClosure is,by default,non-escaPing,then why …”

根据以下评论中的讨论(感谢@Hamish),我们可以在Swift 3.0中说明关于非参数闭包的以下事实:

>默认情况下,它们与人们可能认为的相反,是@escaPing.由于在Swift 3中不推荐使用@noescape(参见例如Xcode 8 release notes或Swift evolution proposal SE-0103),这意味着如果不使用已弃用的方法,则不能使非参数闭包非转义.
>如the following evolution thread所述,非参数闭包缺少@noescape属性是一个缺失的特征(有些回归,因为这不是Swift 2.2中的限制),但未来不一定要实现(如果我要理解苹果开发者乔丹罗斯在联系进化线索中的答案.
>然而,我们可能(仍)将已弃用的@noescape属性应用于非参数闭包以使其无法转义,但随后将显着提示不正确的警告(如下所示,强调我的),现在已报告为@Hamish的一个错误,见bug report SR-2969.

@noescape @H_404_30@is default and is deprecated”

总而言之,localClosure是@escaPing,这自然意味着不能允许它包装test(…)的非转义闭包参数闭包.

[†]通过非参数闭包,我指的是不是函数参数的所有闭包,即没有作为参数提供给函数的闭包.

作为附注,你可能已经知道了你的问题:如果我们希望像你的例子一样处理/包装它,我们可以自然地将闭包标记为@escaPing.

func test(closure: @escaPing () -> ()) -> () -> () {    let escaPingLocalClosure = { closure() }    return escaPingLocalClosure}
总结

以上是内存溢出为你收集整理的swift – 如何在本地闭包内调用非转义闭包?全部内容,希望文章能够帮你解决swift – 如何在本地闭包内调用非转义闭包?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1005645.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存