我有一个以闭包作为参数的方法,如果未提供闭包,则默认为“虚拟”函数。但是,每当我尝试省略默认参数时,编译器都会抛出错误:
Missing argument for parameter 'closureFuncWithDefault' in call
Insert 'parameterClosureFuncWithDefault: <#(object) -> Void#>'
我的代码如下:
func functionWithDefault (object: SCNReferenceNode = SCNReferenceNode(),
closureWithDefault: @escaping (_ object: SCNReferenceNode)->Void = { _ in return }) {
otherClassInstance.loadObject (object, loadedHandler: { [unowned self] loadedObject in DispatchQueue.main.async {
self.otherMethod (loadedObject)
closureWithDefault (virtualObject)
}
})
}
然后从其他地方:
// some code
var objectThing = SCNReferenceNode (URL: ..... )
//
// code block...
//
functionWithDefault (object: objectThing) // <-- This throws the error.
SCN 类和此类东西不是相关的东西,而是具有默认值的闭包参数并能够使用它的正确方法。
最佳答案
常见的语法是使用可选的闭包,用 ?
:
func functionWithDefault (object: SCNReferenceNode = SCNReferenceNode(), closure: @escaping ((_ object: SCNReferenceNode) -> Void)? = nil) {
otherClassInstance.loadObject (object) { [unowned self] loadedObject in
DispatchQueue.main.async {
self.otherMethod (loadedObject)
closure?(virtualObject)
}
}
}
<小时/>
或者,考虑一个更简单的示例:
func foo(completion: @escaping ((Bool) -> Void)? = nil) {
performAsynchronousTask { success in
completion?(success)
}
}
然后您可以将其称为:
foo()
或者
foo { success in
if success { ... } else { ... }
}
关于swift - 为什么我不能忽略 Swift 中默认函数的闭包参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738236/