Funciones en Swift

Definición de función en Swift 

Una función en Swift la podemos definir como un paquete de código, un contenedor de código, que realiza una tarea específica. Se recomienda que una función tenga un nombre claro para que sea facil para el desarrollador entender cual es su objetivo: Por ejemplo:

 

¿Qué forma una función? 

Está formada de parámetros de entrada y parámetros de salida. Aunque una función no retorna nada, siempre retorna algo que es Void. Osea que por debajo digamos que siempre está retornando un tipo. 

En cuanto a los parámetros de entrada, y siguiendo la línea del nombre de la función, es importante que los parámetros también tengan un nombre apropiado, y que sea claro en cuanto a que es ese parámetro. Por ejemplo para una función que realiza una división:

 

Tipos de parámetros de una función en Swift

Hay diferentes formas de pasar estos parámetros, hay diferentes tipos de parámetros y Swift nos permite hacer cosas como inout parameters, parámetros opcionales, variadic parameters, default values… Hay diferentes usos que son muy útiles dependiendo de cada  caso. 

 

Parámetros opcionales en Swift

El parámetro de entrada opcional, es cuando uno pone el parámetro y lo puede usar o no usar  y puede tener un valor por defecto. Por ejemplo, tú tienes una aplicación donde estas capturando voz y la traduces a otro idioma: En este caso capturas una entrada de audio, la pasas a texto y ese texto lo pasas a una función que lo traduce a otro idioma. Puede pasar que esa captura de voz a texto falle y que el método que lo captura te vuelva un nil. Por tanto el parámetro de entrada del traductor puede aceptar un parámetro de entrada opcional, porque no sabe si esa entrada va a ser un texto correcto o no va a serlo, por lo que no sabe que va hacer.  

Lo importante es saber que si se usa un parámetro opcional, hay que hacer chequeos del caso. Cuando se necesita que un parámetro de entrada sea opcional pero sin embargo debe ser usado en el método, se recomienda realizar un guard let para hacer el unwrap del parámetro al principio del método y tener un camino de salida si algo falla.  

 

Default values en Swift

Otra característica de los parámetros de entrada, son los default values. Son interesantes porque puedes llamar una función de diferentes formas. Por ejemplo, puedes usar google translate y no quieres traducir por alguna razón, pero pones traducir de inglés a inglés, para que te corrija la gramática: en ese caso se podría que si no te especifica el idioma, simplemente use el inglés por defecto para el idioma. Esto se especifica en el método después del tipo de parámetros. Se hace así, en el ejemplo de “language” para que sea English por defecto, siendo English un valor de un enum:

Si en la llamada método especificamos un valor, se utliza ese. Si no, se utiliza el de por defecto. En este caso no tendrías que tener un opcional ya que el lenguaje por defecto es inglés, entonces en vez de poner un opcional puedes poner el default value y llamarlo un método de diferente forma así es claro para la persona que está desarrollando porque tienes el check antes en vez del método  se usa el uno o el otro. 

A veces cuando tienes que añadir una funcionalidad nueva, un método o un parámetro nuevo a una clase o un struct y tienes que añadir ese parámetro nuevo a muchos métodos es muy cómodo a la hora que no se te rompan los test el hecho de poner un parámetro nuevo en el método y añadir un valor por defecto, de forma que los test, si no es uno que este probando exactamente eso, pues no se rompen todos los test cases, no tienes que modificarlos. Todo depende de que estás haciendo porque muchos casos necesitas que falle. Es importante saber que estos default values también se pueden pasar en inits. 

En cuanto a otra opción de Swift, en cuanto a omitir argumentos y que no parezca el label cuando llames la función, hace que el lenguaje sea más breve. Sin embargo tiene que estar bien utilizado porque hay desarrolladores que la llevan un poco al extremo y te encuentras cosas como “func calculate in: from: what:…” que no sabes muy bien que estás haciendo. Pero un ejemplo sencillo es algo como el promedio, que sabes que son números y sabes que vas a hacer el promedio, en este caso no necesitas decir cosas así, igual como la división entre un número y otro: Puedes sin mas usar func calculatePromedio(_ num1:Int, _ num2: Int) -> Int. Como normalmente estamos leyendo de izquierda a derecha el numerador será el primero en terminar y el segundo y en esos casos puedes omitirlos muy fácil. Para especificar qué quieres omitirlos se pone un under score y el nombre del parámetro, eso permite cuando llamas a la función lo omites. 

 

Variadic parameters

Los variadic parameters de Swift: Permiten definir una función con parámetros de entrada en el que este parámetro de entrada, por ejemplo: Calcular la media (aritmética de números), cuando no sabes cuantos parámetros de entrada vas a tener porque es la media de “x” en números. En casos asi puedes poner un variadic parameter simplemente especificando tres puntos suspensivos detrás del tipo.

A tener en cuenta:  solo puede haber un variadic parameter en cada función, puede contener de 0 a N valores, no puede tener un default value, ni ser opcional.  

 

Inout parameters

Por otro lado esta el inout parameter: se pone inout antes del tipo de parámetro. Un ejemplo de inout: Una función que intercambia un numero por otro dentro de la propia función. En  Swift el inout permite que cuando trabajemos con ese parámetro de entrada dentro de la función y lo alteremos, cuando esa función acabe, ese valor se copia sobre la variable inicial, de forma que estamos modificando un valor de entrada dentro de la propia función. Un ejemplo de esto puede ser una función que intercambia un elemento con otro; dentro de la propia función haces una copia de uno, lo asignas al otro y al salir están intercambiados. Al final es mutar un valor dentro de una función que a la salida le actualizas un valor. 

 

Funciones dentro de funciones en Swift

Otro tema importante es usar funciones dentro de funciones, también están los return types donde puedes retornar funciones de una función, es decir las funciones son como una variable al final. Esto es muy útil, lectura del código es amena y también cuando tienes que hacer flatMap de x o y, puedes pasar la función que recibe como parámetro ese valor que se está haciendo el flatMap y ahí puedes ejecutar esa función.  Un ejemplo es comun verlo junto con NSURLSession y completion blocks. 

En Swift las funciones se tratan como parámetros a como variables que puedes almacenar en una constante, una variable, pasarlas a través de tu código como parámetro de entrada, de salida, son exactamente igual. Da mucha flexibilidad.  

Deja un comentario