在objective-C中,我可以将nil完成处理程序传递给任何函数。来到Swift3我对nil闭包定义有点挣扎。我有一个像这样定义的函数:
func doSomething ( completion : @escaping (Error?) -> ()? ) {
let error = foo( completion : { (error) in
completion (error)
})
}
现在重点是我尝试使用nil参数调用此函数来完成,因为我不关心结果,我只是想启动一个后台活动。调用
doSomething ( completion : nil)
导致错误" nil与类型(错误)不兼容 - > ()&#34?; 这在Obj-C中非常好。我试图谷歌上下,但没有成功。我试图围绕闭包定义重新定位问号,但不是运气。
我如何实现这一目标?
答案 0 :(得分:4)
我试图围绕闭包定义重新定位问号但不是运气。
您不能重新定位问号。你需要添加大括号。
目前,(Error?) -> ()?
是一个非可选的闭包类型,它包含以下两部分:
(Error?)
Void?
正如您所看到的,它会返回一个可选的Void
,它不是非常有用,是吗?
?
与()
相关联,而非整个闭包类型。要强制它与整个闭包类型相关联,只需在你想要选择的东西周围加上大括号:
((Error?) -> ())?
答案 1 :(得分:1)
重写您的功能如下:
func doSomething ( completion : ((_ error: NSError?) -> Swift.Void)? ) {
let error = foo( completion : { (error) in
completion?(urlString, error)
})
}