Tengo un método con un cierre como parámetroque por defecto es una función "ficticia" si no se proporciona ningún cierre. Sin embargo, cada vez que intento omitir el parámetro con el valor predeterminado, el compilador arroja el error:
Falta el argumento para el parámetro "cierreFuncWithDefault" en la llamada
Insertar "parameterClosureFuncWithDefault: <# (objeto) -> Void #>"
Mi código es el siguiente:
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)
}
})
}
Luego de otro lugar:
// some code
var objectThing = SCNReferenceNode (URL: ..... )
//
// code block...
//
functionWithDefault (object: objectThing) // <-- This throws the error.
La clase SCN y esas cosas no son las cosas relevantes, sino la forma correcta de tener un parámetro de cierre con un valor predeterminado y poder usarlo.
Respuestas
0 para la respuesta № 1La sintaxis común es usar un cierre opcional, llamándolo con ?
:
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)
}
}
}
O, considerando un ejemplo más simple:
func foo(completion: @escaping ((Bool) -> Void)? = nil) {
performAsynchronousTask { success in
completion?(success)
}
}
Y luego puedes llamar a esto como:
foo()
O
foo { success in
if success { ... } else { ... }
}