【发布时间】:2016-10-16 17:00:59
【问题描述】:
我有一个看起来像这样的函数:
func test(closure: () -> ()) {
let localClosure = { closure() }
localClosure()
}
这只是一个例子,并不能完全反映我遇到的问题,显然这里我可以直接调用closure!
应该清楚,在上面的代码中,closure 不能转义。但是,我得到了错误:
闭包使用非转义参数'closure'可能会允许它转义
现在,如果localClosure 以某种方式逃逸,我会理解这个错误,但它不会逃逸。我什至尝试将localClosure 注释为@noescape(即使该属性在 Swift 3 中已被弃用),并且根据我收到的警告:
@noescape 是 默认值,已弃用
如果localClosure 默认情况下是非转义的,那么为什么另一个非转义闭包不能进入其中呢?或者这是编译器的错误/限制?
【问题讨论】:
-
可能相关的问答(至少 w.r.t 编译器关于
localClosure默认为@noescape的虚假警告,但事实并非如此):Why do closures require an explicitselfwhen they're all non-escaping by default in Swift 3? -
@Hamish 我相信目标线程实际上是该线程的完美欺骗标记(即使这是一个稍微不同的问题,目标的答案也回答了这个问题):整个讨论(和以前答案)一旦明确默认情况下非参数闭包实际上是
@escaping,那么一个简单的事实就崩溃了。投票欺骗标记! -
@dfri 嗯....实际上考虑一下,我同意 - 鉴于答案基本上是“
localClosure实际上是@escaping,目前没有(非弃用) 将其标记为非转义的方式".