Funciones en Swift 3

| 2017-08-22 | No hay comentarios »

Una función (método o procedimiento, como prefiramos llamarlo) es un trozo de código con entidad propia que recibe o puede recibir unos valores y que devolverá o puede devolver un resultado. Su cometido es simple: permitir ejecutar una serie de instrucciones en nuestro código, de manera repetida, sin tener que poner el mismo código cada vez.

Las funciones se declaran siempre con la palabra clave func seguida del nombre que queramos darle. Luego, imprescindible, paréntesis. Si la función no recibe parámetros de entrada (valores con los que trabajará) ponemos unos de apertura y cierre seguidos () y si no, separados por coma ponemos los parámetros y el tipo de los mismos. Las funciones no tienen inferencia de tipos y siempre hemos de indicar cuál es el de cada variable de entrada.

Tras los parámetros de entrada, si no vamos a tener parámetros de salida que devolveremos con la función, directamente abrimos corchete y empezamos a escribir el cuerpo de la misma. En caso de querer usar de salida, usamos los símbolos -> e indicamos el tipo o tipos de variables que vamos a devolver. Podemos no usar nombre en cuyo caso se podrá acceder a ellas por índice o ponerles nombre para que sean más fáciles de identificar. Ejemplos:

// Sin parámetros de entrada ni salida

func saludo(){

    print("Hola")

}

// Recibe dos parámetros a y b, ambos de tipo Int

func sumar(a:Int, b:Int) -> Int{

    return a + b;

}

// Recibe los mismos dos y devuelve otros dos de tipo Int y String

func tipoDispositivo(width:Float, height:Float) -> (Int, String) {

    return (3, "i")

}

// Recibe los mismos dos y devuelve

// otros dos de tipo Int y String con nombre

func tipoDispositivoLabels(width:Float, height:Float) -> (valor: Int, cadena: String) {

    return (3, "i")

}

saludo()

print(sumar(a: 1, b : 2))

print(tipoDispositivo(width: 1, height: 1))

print(tipoDispositivoLabels(width: 10.1, height: 15.1))

Podemos usar tantos parámetros de entrada como queramos. A la hora de invocarlos, no obstante, hemos de recordar que (salvo cambio por nuestra parte) el nombre del parámetro siempre se infiere (no hay que indicar, solo el valor) y a partir del segundo siempre habrá que indicarlo. Esto se debe a que el lenguaje que el primer parámetro tiene que tener su significado contextualizado en el nombre de la propia función.

Es muy importante recordar que el compilador en tiempo real de Swift nos prevendrá de usar funciones con parámetros de salida donde no usemos la palabra clave return seguido de lo que vamos a devolver. Si el código de la función, en alguno de sus flujos, no finaliza con un return el compilador nos dará error.

Polimorfismo

Vamos a probar el polimorfismo. Esto no es más que la capacidad de una función de ser definida de diferentes formas y tener diferentes comportamientos en función de cómo es invocada.

func sumar(c1:Int, c2:Int) -> Int {

    return c1 + c2

}

Pero, ¿y si queremos poder usar también con más valores? Pues creamos otra definición con el mismo nombre y otros parámetros.

func sumar(c1:Int, c2:Int, c3:Int, c4:Int) -> Int {

    return c1 + c2 + c3 + c4;

}

print(sumar(c1 : 1, c2: 2));

print(sumar(c1 : 1, c2: 2, c3: 3, c4: 4));

De esta forma podemos usar uno u otro indistintamente y cuando escribamos el asistente de código nos mostrará ambas definiciones para que elijamos aquella que nos resulte más práctica en ese momento.

Valores por defecto

También podemos usar valores por defecto en las funciones para pre-asignar parámetros en caso que no se indique un valor para estos en la llamada. De esta forma, podremos indicar o no (según el caso) un parámetro en función de nuestro interés.

Vamos a suponer que queremos unir cadenas separadas por un espacio pero, opcionalmente, puede que queramos usar otros caracteres como un guión o un hashtag. De igual forma, puede que queramos que queramos unir dos cadenas, o puede que queramos dos o cuatro o diez. Vamos a crear entonces una función que reciba un array de cadenas y un valor opcional de separador:

func unirCadenas(separador:Character = " ", cadenas:[String]) -> String {

    var union:String = ""

    for cadena in cadenas {

        union += cadena

        union += String(separador)

    }

    return union

}

Con esta función, si indicamos el separador usará el de nuestra elección, pero si no, usará un espacio. Ahora solo tenemos que llamar a nuestra función de una de estas dos maneras:

let t1 = unirCadenas(separador: "-", cadenas: ["valor1", "valor2", "valor3"])

let t2 = unirCadenas(cadenas:["valor1", "valor2", "valor3"])

Claramente vemos que si no incluimos el valor para separador, no importa pues el sistema cogerá el que hemos asignado por defecto. Eso sí, para evitar errores tenemos que indicar que el parámetro que estamos enviando es cadenas y no separador, que además, al ser el primer parámetro, va intrínseco.

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • Manual básico de Swift 3
  • Estructuras y Protocolos en Swift 3
  • Tuplas y Enumeraciones en Swift 3
  • Clases en Swift 3



SEGUÍNOS EN FACEBOOK


GITHUB