Diferentes types de syntax de cierre en Swift, ¿cuál es correcto?

Tengo mucha curiosidad sobre cuál de estas declaraciones de syntax es (más) correcta. Playground comstack felizmente ambos casos.

Método 1

// copied from SO and this appears clear to me UIView.animate( withDuration: 3.0, animations: { }, completion: { (Bool) in // completion code } ) 

Método 2

 UIView.animate( withDuration: 3.0, animations: { // code }) {(Bool) in // code when finished? // argument label completion missing? } 

¿Por qué los corchetes networkingondeados en el segundo método están cerrados antes de que se indique el último argumento? ¿O es esa otra implementación de UIView.animation ?

La diferencia entre ambos methods es la siguiente:

Método 1: cierre regular

Método 2: cierre posterior . El último parámetro de cierre en la firma de una function se puede escribir en una syntax más corta . Si el segundo parámetro se completion y animations parámetro de animations fuera el último, el cierre posterior se aplicaría a las animaciones, etc. Por lo tanto, debe aparecer como el último (o el único) parámetro de cierre.

Si omite una label de completion , puede escribirla de la siguiente manera:

 UIView.animate(withDuration: 3.0, animations: { }) {(completion: Bool) in } 

Para completar su pregunta también: es la misma implementación de una function idéntica, pero una syntax diferente .

Ambos son correctos.

  1. Es la syntax de cierre habitual en una llamada de function.

  2. Representa un cierre posterior .

Si necesita pasar una expresión de cierre a una function como el argumento final de la function y la expresión de cierre es larga, puede ser útil escribirla como un cierre posterior. Un cierre posterior se escribe después de los paréntesis de la function de llamada, aunque sigue siendo un argumento para la function. Cuando utiliza la syntax de cierre posterior, no escribe la label de argumento para el cierre como parte de la llamada de function.

Puede leer más sobre los cierres finales de https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html