ios objective-c swift closures objective-c-blocks

Diferencia entre bloque(Objetivo C) y cierre(Swift) en ios



objective-c closures (3)

En los tutoriales está escrito que, funcionalmente, ambos son iguales, incluso el cierre es más fácil que el bloqueo y se evita la complejidad de la administración de bloques y memoria. He seguido muchos tutoriales, pero a excepción de estos, no obtengo la diferencia entre el "cierre" de swift y Objective-C "bloque".

¿Alguien puede explicar esta diferencia en profundidad? Cualquier ayuda sería apreciada.


Extracto de: Apple Inc. "Uso de Swift con Cocoa y Objective-C". IBooks:

“Los cierres Swift y los bloques Objective-C son compatibles, por lo que puede pasar los cierres Swift a los métodos Objective-C que esperan bloques. Los cierres y las funciones de Swift tienen el mismo tipo, por lo que incluso puede pasar el nombre de una función de Swift.

Los cierres tienen una semántica de captura similar a los bloques, pero se diferencian en una forma clave: las variables son mutables en lugar de copiarse. En otras palabras, el comportamiento de __block en Objective-C es el comportamiento predeterminado para las variables en Swift ".


Ligeras diferencias. Uno fue mencionado; Las variables se capturan como variables, no como valores. Lo que puede ser útil o una trampa. Es importante destacar que puede definir una lista de captura en un cierre Swift, por lo que si incluye self.property en la lista de captura, entonces el valor de esa propiedad se captura, y no uno mismo. Eso también simplifica la captura de variables débiles.


Para mostrar un ejemplo de código real de las diferencias:

Esto compila:

let x : @convention(swift) (inout Int) -> ()

Esto no lo hace:

let y : @convention(block) (inout Int) -> ()

con el error (inout Int) -> () is not representable in Objective-C