El Tipo de una Función

Tutorial Swift – El Tipo de una Función

El día de hoy aprenderemos sobre el tipo de una función, algo así como el tipo de una variable. Como ya todos debemos de saber cada función tiene una firma, la cual consiste en los tipos de parámetros de entrada y de retorno. Podemos usar esta firma como cualquier otro tipo en Swift, lo que nos permite de manera fácil pasar funciones como parámetros de otras funciones y retornar funciones desde otras funciones. Las funciones también pueden ser escritas dentro de otras funciones para encapsular funcionalidades dentro de un ámbito de función anidada.

Comencemos por tomar como referencia la siguiente función:

…esta función toma dos valores Int y devuelve el resultado también como un valor Int, por lo que el tipo de esta función es:

(Int, Int) -> Int

Otro ejemplo de función pudiera ser:

…esta función no toma ningún parámetro ni tampoco retorna dato alguno, el tipo en este caso es:

() -> Void

…escribimos Void para representar que no hay retorno.

Usando el tipo de función

El uso del tipo de función es muy sencillo, los tratamos como si fuese un tipo de dato común. Por ejemplo podemos declarar una constante o variable que el tipo de dato de la misma sea el tipo de una función para luego asignarle como valor una función que cumpla con esta firma o tipo. Algo así:

…en la línea 11 declaramos la variable mathFunction de tipo (Int, Int) -> Int y se iguala con la función multiplyTwoInts como su valor, en la línea 13 hacemos uso de esta variable donde podemos ver que la llamada que hacemos de esta luce como si fuese una función.

Swift en este caso también es capaz de inferir el tipo de dato de una constante o variable si la igualamos a una función, ejemplo:

…en este código el tipo de mathFunction sería (Int, Int) -> Int pero esta vez inferido por el compilador.

Tipos de función como parámetros

Podemos utilizar un tipo de función (como (Int, Int) -> Int) como un tipo de parámetro para otra función. Esto nos permite dejar algunos aspectos de la implementación de una función en manos de la función que efectúa la llamada.

Aquí un ejemplo de una función que imprime el valor de retorno de la función que se pasa como parámetro:

…en la línea 13 podemos ver el segmento myFunction: (Int, Int) -> Int en el área de parámetros, aquí estamos definiendo el primero como tipo de función, lo vemos en uso en la línea 15. La línea final, es donde efectuamos la llamada a esta función, donde pasamos como primer parámetro nuestra función multiplyTwoInts que es la encargada de efectuar la operación matemática que deseamos, seguido del segundo y tercer parámetro que no son más que los número que multiplicaremos, la función hace lo que su nombre indica, imprime el resultado del cálculo efectuado por la función que se le pasa como parámetro.

Valores de retorno

Como es lógico si podemos recibir funciones como parámetros también tenemos la posibilidad de retornarlas. Aquí un ejemplo:

…la salida en pantalla sería:

En este código implementamos un sistema de ejemplo que nos permite dado un número irlo acercando a cero, aumentándolo en caso de ser negativo y disminuyéndolo en caso contrario.

De la línea 5 a la 15 tenemos la implementación de las funciones stepForward y stepBackward que son las encargadas de aumentar o disminuir el número en cuestión. De la línea 17 a la 21 tenemos la función chooseStepFunction, la cual recibe un valor Booleano indicando a la función si el valor introducido por el usuario es mayor a cero, de ser cierto, se retorna la función stepBackward o de lo contrario stepForward. Regresando a la línea 17 podemos ver que tras la flecha que indica que la función retorna un valor en sustitución a un tipo de dato, como usualmente hemos visto, esta vez tenemos el tipo de función, (Int) -> Int compatible con las dos funciones que podemos retornar dado cualquier caso.

En la línea 23 creamos la variable currentValue la cual igualamos a 10, este será el número con el que trabajaremos. En la siguiente línea de código creamos una costante llamada moveNearerToZero la cual igualamos con la llamada a la función chooseStepFunction. Dado que 10 es mayor que 0 la función retorna la función stepBackward quedando así la constante moveNearerToZero igualada a esta función, constante que luego usamos de la línea 31 a la 37 donde vamos iterando sobre esta que a su vez va reduciendo el valor 10 en uno en cada ciclo del bucle.

Función anidada

Una función anidada es aquella que ha sido definida dentro del cuerpo de otra. Las funciones anidadas están ocultas al exterior de la función o dicho de otra manera su ámbito está restringido al cuerpo de la función donde esta fue creada y solamente dentro de este podrá ser llamada, pero como ya vimos las funciones pueden retornar funciones, por lo que en caso de ser necesario una función anidada puede extender su ámbito al ser retornada por su función padre. Veamos el ejemplo anterior con algunas modificaciones:

…solamente hemos efectuado un cambio en este código y es que ahora las funciones stepForward y stepBackward se encuentran dentro de la función chooseStepFunction, a mi modo de ver una versión mucho más limpia que la anterior.

Espero que todo cuanto se ha dicho aquí, de una forma u otra le haya servido de aprendizaje, de referencia, que haya valido su preciado tiempo.

Este artículo, al igual que el resto, será revisado con cierta frecuencia en pos de mantener un contenido de calidad y actualizado.

Cualquier sugerencia, ya sea errores a corregir, información o ejemplos a añadir será, más que bienvenida, necesaria!