Swift3 Swift中的转义nil闭包定义

Swift3 Swift中的转义nil闭包定义,swift3,Swift3,在objective-C中,我可以将nil完成处理程序传递给任何函数。谈到Swift3,我对零闭包的定义有点纠结。我有一个定义如下的函数: func doSomething ( completion : @escaping (Error?) -> ()? ) { let error = foo( completion : { (error) in completion (error) }) } 现在的重点是,我尝试用nil参数调用这个函数来完成,因为我不

在objective-C中,我可以将nil完成处理程序传递给任何函数。谈到Swift3,我对零闭包的定义有点纠结。我有一个定义如下的函数:

func doSomething ( completion : @escaping (Error?) -> ()? ) {
    let error = foo( completion : { (error) in 
        completion (error)
    })
}
现在的重点是,我尝试用nil参数调用这个函数来完成,因为我不关心结果,我只想启动一个后台活动。召唤

doSomething ( completion : nil)
导致错误“nil与类型(错误)->()不兼容” 在Obj-C中,这很正常。我试着上下搜索,但没有成功。我试图围绕闭包定义重新定位问号,但运气不好

我如何做到这一点

我试图围绕闭包定义重新定位问号,但运气不好

你不只是重新定位问号。您需要添加大括号

目前,
(Error?->()?
是一种非可选的闭包类型,包含以下两部分:

(Error?)
Void?
如您所见,它返回一个可选的
Void
,这不是很有帮助,是吗

()
关联的
,而不是整个闭包类型。要强制它与整个闭包类型关联,只需在要使其成为可选的内容周围加上大括号:

((Error?) -> ())?

按如下方式重写您的函数:

func doSomething ( completion : ((_ error: NSError?) -> Swift.Void)? ) {
    let error = foo( completion : { (error) in 
            completion?(urlString, error)
    })
}

问题是,它对逃跑不起作用。我得到了“转义属性仅适用于函数类型”错误。将转义放在大括号内会导致“转义属性只能在函数参数位置使用”编译错误。好的,看来我找到了。虽然你的例子是正确的,但需要注意一点。默认情况下,似乎正在转义可选的闭包。不需要转义关键字,这有点令人沮丧,但它至少可以工作。