/ / ¿Por qué no puedo ignorar un parámetro de cierre con una función predeterminada en Swift? - veloz, cierres, parámetros predeterminados

¿Por qué no puedo ignorar un parámetro de cierre con una función predeterminada en Swift? - Swift, cierres, parámetros por defecto.

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 № 1

La 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 { ... }
}