Hacemos mucho trabajo asincrónico en dispositivos móviles en un esfuerzo por evitar que nuestro código bloquee el hilo principal. Anteriormente, eso significaba muchos métodos de delegado, pero los avances más recientes en Objective-C nos permitían devolver valores a bloques como controladores de finalización. Sin duda, también tendremos que hacer mucho de esto en swift.

Aquí hay una definición de función de Objective-C que hace uso del patrón de bloque de finalización y la sintaxis asociada para usarlo:

- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;;

Gracias Puta Sintaxis de Bloque! Nunca puedo recordar estas cosas, ya sea

Swift tiene alguna oportunidad de mejorar esto, ya que no tiene que ser una adición de lenguaje pensada de último momento, se puede incorporar desde el principio.

El resultado puede parecer complejo (como lo hacen todas las declaraciones de funciones en funciones), pero es realmente simple. Es solo una definición de función que toma una función como argumento, por lo que, siempre y cuando entiendas el anidamiento, esto debería aclararse rápidamente:

func hardProcessingWithString(input: String, completion: (result: String) -> Void) {...completion("we finished!")}

El cierre de finalización aquí es solo una función que toma una cadena y devuelve void. Al principio, esto suena al revés, ¿toma una cuerda como argumento? Queremos devolver una cadena! – pero en realidad no queremos devolver una cuerda, eso significaría que hemos bloqueado hasta que regresemos. En su lugar, estamos llamando a una función que el destinatario nos ha dado y proporcionándoles los argumentos asociados.

Usar controladores de finalización es más fácil que declararlos, gracias a una forma inteligente de acortar las llamadas a funciones del equipo de swift:

hardProcessingWithString("commands") {(result: String) inprint("got back: \(result)")}

Este es un cierre final, algo que podemos usar siempre que el último argumento sea un cierre. Usando la sintaxis {() in } algo extraña, mágicamente tenemos los resultados de que pasamos el cierre de nuevo en nuestra función asíncrona. Realmente todavía tengo que sondear las profundidades de swift para entender qué hace que esta sintaxis funcione, pero por ahora estoy feliz de que funcione.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.