Categories
Swift Development

100 Dias de Swift Día 5

Día 5

Estas son mis notas para el curso de Swift https://www.hackingwithswift.com

Entrada anterior

“Dennis Ritchie (the creator of the C programming language) encouraged modularity by telling all and sundry that function calls were really, really cheap in C. Everybody started writing small functions and modularizing. Years later we found out that function calls were still expensive, and our code was often spending 50% of its time just calling them. Dennis had lied to us! But it was too late; we were all hooked…”

Steve Johnson

“Dennis Ritchie (el creador del lenguaje de programación C) alentó la modularidad diciendo a todos que cada una de las llamadas a funciones eran realmente muy rápidas en C. Todos comenzaron a escribir pequeñas funciones y modularizar. Años después descubrimos que las llamadas a funciones seguían siendo lentas, y nuestro código a menudo pasaba el 50% de su tiempo simplemente haciendo las llamadas. ¡Dennis nos había mentido! Pero era demasiado tarde; todos estábamos enganchados … “

Steve Johnson

Esta cita es de tiempos mas oscuros cuando las llamadas a funciones eran algo lento

Writing functions

Las funciones nos permiten reciclar código y usarlo en varios lugares después, repertir código es normalmente una mala idea.

Para crear una función usamos la palabra reservada «func» luego el nombre de tu función, luego abrimos y cerramos paréntesis como en el siguiente ejemplo.

func bienvenida() {
 let mensaje = "Bienvenido a mi App"
 print(mensaje)
}

ahora podemos correr este código solo usando «bienvenida()»

bienvenida()

Correr el código de una función también se conoce como Llamar a una función

Accepting parameters

Las funcione se vuelven mas poderosas cuando permitimos que acepten parámetros para hacer esto solo debemos especificar entre paréntesis el nombre del parámetro y el tipo de dato.

func bienvenida(nombre: String) {
 let mensaje = "Bienvenido \(nombre) a mi App"
 print(mensaje)
}

bienvenida(nombre: "Misael")
bienvenida(nombre: "Juan")

Este código puede imprimir un mensaje de saludo personalizado para cada usuario

Otro ejemplo para sumar números

func suma(numeroA: Int , NumeroB: Int){
    let suma = numeroA + NumeroB
    print(suma)
}

suma(numeroA: 4, NumeroB: 5)
suma(numeroA: 12, NumeroB: 10)

Returning values

Regresar valores

Así como podemos proporcionar parámetros podemos devolver valores para hacer esto usamos « ->» y ademas el tipo de dato, para devolver el valor usamos «return»

func suma(numeroA: Int , NumeroB: Int) -> Int{
     let suma = numeroA + NumeroB
     return suma
     // ningún código sera ejecutado después del return
 }

Ahora podemos usar el valor que nos regresa la función para algo mas

let resultadoDeLaSuma = suma(numeroA: 4, NumeroB: 12)
print("El resultado de la suma es \(resultadoDeLaSuma)")

Parameter labels

Etiquetas para los parámetros

Podemos usar las etiquetas de los parámetros para hacer mas legible nuestro código, para eso solo suministramos dos nombres separados por un espacio. El primero se usa fuera de la función y el otro de manera externa.

 func bienvenida(a nombre: String) {
  let mensaje = "Bienvenido \(nombre) a mi App"
  print(mensaje)
 }

bienvenida(a: "Misael")

Omitting parameter labels

Ahora habrás notado que funciones como «print(“Hello”)» no tienen una etiqueta en el parámetro, en ciertas ocasiones es también mas legible omitir el nombre del parámetro por ejemplo

 func saludarA(_ nombre: String) {
  let mensaje = "Bienvenido \(nombre) a mi App"
  print(mensaje)
 }

saludarA("Misael")
saludarA("Juan")

Esto puede hacer mas legible nuestro código, pero también podría hacerlo mas confuso por ejemplo

ponerAlarma(5)

Este código es bastante confuso ¿La alarma es para las 5am o 5pm o es para dentro de 5 minutos u horas o días?

Así que piensa con cuidado como hacer tu código mas legible

Default parameters

Podemos suministrar valores por default para nuestras funciones solo agregando «=» después del tipo de dato

func saludarA(_ nombre: String, amablemente: Bool = true) {
    var mensaje = ""
    if amablemente == true {
        mensaje = "Bienvenido \(nombre) a mi App"
    } else {
        mensaje = "¡Oh no, es \(nombre) de nuevo 🤢!"
    }
    
  print(mensaje)
 }

saludarA("Misael")
saludarA("Juan", amablemente: false)

Como ves podemos llamar a esta función de dos maneras diferentes

Variadic functions

Algunas funciones pueden usar varios parámetros del mismo tipo, para eso solo añadimos «…» después del tipo de dato, swift creara un Array con los valores que suministremos

func calcularCuadrados(numeros: Int...) {
    for numero in numeros {
        print("\(numero) al cuadrado es \(numero * numero)")
    }
}

calcularCuadrados(numeros: 1,2,3,4,5,6,7,8,9,10)

Writing throwing functions

Cuando se suministra un dato erróneo a una función esta puede fallar, swift nos deja «tirar» errores cuando algo sale mal, usando la palabra reservada «throw»

Para empezar debemos crear un enum con los tipos de error

enum errorDeContraseña: Error {
    case muyObvia
}
func revisarContraseña(_ contraseña: String) throws -> Bool {
    if contraseña == "contraseña" {
        throw errorDeContraseña.muyObvia
    }

    return true
}
Sin embargo podemos ver que usar la función de esta forma nos muestra una alerta

y así podemos saber exactamente en que fallo nuestra función

Running throwing functions

Ahora bien a Swift no le gusta tener errores cuando llamamos a una función así que necesitamos llamarla de manera segura, para hacer esto usamos las palabras reservadas «do» para iniciar un código que podría causar problemas, «try» frente a la función que puede causar problemas, y «catch» para manejar el error de manera mas elegante

 do {
     try revisarContraseña("contraseña")
     print("¡Buena contraseña!")
 } catch {
     print("¿Enserio 😐?")
 }
Ahora todo funciona fluido

Inout parameters

Los parámetros de una función son constantes, si queremos que nuestros parámetros cambien el valor suministrado en lugar de regresar uno nuevo debemos usar «inout» antes del tipo de dato y ademas «&» antes de el nombre de tu variable, que por cierto no puedes usar constates pues tu valor sera cambiado

 func dobleOnada(numero: inout Int) {
     numero *= 2
 }
 
 var miNumero = 10
 dobleOnada(numero: &miNumero)
 
 print(miNumero)
como puedes ver esta función cambia efectivamente el valor de tu variable

Resumen

Las funciones nos permiten reutilizar código

Las funciones aceptan parámetros solo especia a Swift que tipo de parámetros son

Las funciones pueden regresaros valores, solo especifica que tipo de valor deseas recibir

Puedes usar diferentes etiquetas para los parámetros u omitir sus nombres para hacer mas legible tu código

Los parámetros pueden tener valores por default lo cual es util para escribir menos código que tiende a repetirse

Podemos usar parámetros que usen cero o mas valores y Swift los convertirá en un Array

Las funciones pueden arrojar errores (throw errors) pero debemos usarlas con try y catch

Podemos usar inout para cambiar variables dentro de una función, aunque lo mejor es devolver una valor nuevo.

// y bueno eso fue el resumen de funciones, la verdad es que hay algunos temas muy simples como arrojar errores que son muy útiles 

Referencias

https://www.hackingwithswift.com/100

https://www.hackingwithswift.com/100/5

Proximo Día

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *