swift – 如何在本地闭包内调用非转义闭包?
参见英文答案 >
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() } 这只是一个例子,并没有完全反映我遇到的问题,显然在这里我可以直接调用封闭! 应该清楚的是,在上面的代码中,封闭无法逃脱.但是,我收到错误:
现在,如果localClosure以某种方式转义,我会理解这个错误,但它不会逃脱.我甚至尝试将localClosure注释为@noescape(即使该属性在Swift 3中已弃用),并根据我得到的警告:
如果localClosure在默认情况下是非转义的,那么为什么另一个非转义闭包不能进入呢?或者这是编译器的错误/限制? 解决方法
默认情况下,非参数闭包是@escaping
根据以下评论中的讨论(感谢@Hamish),我们可以在Swift 3.0中说明关于非参数闭包的以下事实: >默认情况下,它们与人们可能认为的相反,是@escaping.由于在Swift 3中不推荐使用@noescape(参见例如Xcode 8 release notes或Swift evolution proposal SE-0103),这意味着如果不使用已弃用的方法,则不能使非参数闭包非转义.
总而言之,localClosure是@escaping,这自然意味着不能允许它包装test(…)的非转义闭包参数闭包. [?]通过非参数闭包,我指的是不是函数参数的所有闭包,即没有作为参数提供给函数的闭包. 作为附注,你可能已经知道了你的问题:如果我们希望像你的例子一样处理/包装它,我们可以自然地将闭包标记为@escaping. func test(closure: @escaping () -> ()) -> () -> () { let escapingLocalClosure = { closure() } return escapingLocalClosure } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |