我有一个带两个参数的函数,最后一个参数是一个回调闭包:
func myAsycTask(name: String, callback: @escaping ()->Void) {
myQueue.async{
self.doTask(name)
callback()
}
}
func doTask(name: String) {...}
我想让第二个回调闭包参数可选。我试图将上面的函数重新定义为:
func myAsycTask(name: String, callback: @escaping ()->Void? = nil) {
myQueue.async{
self.doTask(name)
callback()
}
}
我收到编译错误:
无默认参数值无法转换为'
() ->
'
如何实现我的需求?
答案 0 :(得分:5)
您当前的代码意味着Void
是闭包中的可选返回(这没有多大意义,因为Void
已经没有了)。您应将参数括在括号中,然后将其设为可选。
func myAsycTask(name: String, callback: (() -> Void)? = nil)
答案 1 :(得分:1)
尝试进行回调关闭可选并删除 @escaping 。 @escaping 注释是没有意义的,因为你的参数基本上是一个枚举(可选是一个包含2种情况的枚举:some(Value)和none) 如果你的闭包属于另一种类型,它就会隐式转义。
import UIKit
// Also you can use a typealias to keep code more readable
typealias Callback = (() -> Void)
class Test {
let myQueue = DispatchQueue(label: "com.playground")
func doTask(name: String) {
// something...
}
func myAsycTask(name: String, callback: Callback? = nil) {
myQueue.async { [weak self] in
self?.doTask(name: name)
callback?()
}
}
}