澄清:
为了理解这个案例,实现以下代码会很有用:
typealias completion = () -> ()
enum CompletionHandler {
case success
case failure
static var handler: completion {
get { return { } }
set { }
}
}
func doSomething(handlerParameter: completion) {
let chObject = CompletionHandler.handler = handlerParameter
}
乍一看,这段代码似乎是合法的,但事实并非如此!你会得到编译时错误抱怨:
错误:分配非转义
参数 'handlerParameter' 到 @escaping 闭包
让 chObject = CompletionHandler.handler = handlerParameter
请注意:
注意:参数 'handlerParameter' 是隐式非转义函数
doSomething(handlerParameter: 完成) {
这是为什么呢?假设是代码sn-p与@escaping无关...
实际上,由于 Swift 3 已经发布,如果在 enum、struct 或 class 中声明闭包,它会被“转义”默认。
作为参考,报告了与此问题相关的错误:
虽然他们可能不是 100% 与此案相关,但受让人的 cmets 清楚地描述了该案:
First comment:
这里的实际问题是 可选闭包是隐式的
@escaping 现在。
Second comment:
不幸的是,Swift 3 就是这种情况。这里是语义
在 Swift 3 中转义:
1) 函数参数位置的闭包是
默认不转义
2) 所有其他闭包都在逃逸
因此,所有泛型类型参数闭包,例如 Array 和 Optional,都在转义。
显然,Optional 是枚举。
同样——如上所述——同样的行为也适用于类和结构:
类案例:
typealias completion = () -> ()
class CompletionHandler {
var handler: () -> ()
init(handler: () -> ()) {
self.handler = handler
}
}
func doSomething(handlerParameter: completion) {
let chObject = CompletionHandler(handler: handlerParameter)
}
结构案例:
typealias completion = () -> ()
struct CompletionHandler {
var handler: completion
}
func doSomething(handlerParameter: completion) {
let chObject = CompletionHandler(handler: handlerParameter)
}
上述两个代码 sn-ps 会导致相同的输出(编译时错误)。
为了解决这个问题,你需要让函数签名为:
func doSomething( handlerParameter: @escaping completion)
回到主要问题:
由于您期望您必须让completion:(()->())? 被转义,这将自动完成-如上所述-。