UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

Bucles

Los ordenadores son excelentes para realizar tareas aburridas billiones de veces en el tiempo que tardas en leer esta frase. Cuando necesitas repetir tareas en tu programa, puedes copiar y pegar varias veces tu código, o utilizar bucles – simples construcciones de programación que repiten un bloque de código siempre que una condición sea cierta.

Para demostrarlo, te presento una función especial de depuración de errores llamada print(): das algún texto para imprimir, y lo imprimirá. Si estás utilizando un playground como nosotros, verás que tu texto aparece en la ventana de resultados. Si estás ejecutando una app real en Xcode, verás que tu texto aparece en la ventana de depuración de Xcode. En cualquier caso, print() es un buen modo de ver de un vistazo el contenido de una variable.

Mira este código:

print("1 x 10 is \(1 * 10)")
print("2 x 10 is \(2 * 10)")
print("3 x 10 is \(3 * 10)")
print("4 x 10 is \(4 * 10)")
print("5 x 10 is \(5 * 10)")
print("6 x 10 is \(6 * 10)")
print("7 x 10 is \(7 * 10)")
print("8 x 10 is \(8 * 10)")
print("9 x 10 is \(9 * 10)")
print("10 x 10 is \(10 * 10)")

Cuando el código termina de ejecutarse, verás la tabla de multiplicación del 10 el panel de resultados de tu playground. Pero este código es poco eficiente, y en realidad una manera más limpia es recorrer una serie de números utilizando el que está llamado como el operador de serie cerrado, cual es tres periodos en una fila: ...

Utilizando este operador, podemos reescribir todo lo anterior en tan solo tres líneas:

for i in 1...10 {
    print("\(i) x 10 is \(i * 10)")
}

El panel de resultados solo muestra "(10 veces)" para nuestro bucle, lo que significa que el bucle se ejecutó 10 veces. Si deseas saber lo que realmente hizo el buble, haz clic en el cuadro inmediatamente a la derecha de "(10 veces)". Aparecerá una caja que dice "10 x 10 is 100" en su código, y si haces clic con el botón derecho, verás una opción de "Value History". Haz clic en esto ahora, y verás la foto a continuación:

Cuando un playground de Swift ejecuta un bucle solo muestra cuantas veces que fue ejecutado. Si quieres ver los valores, haz clic en el cuadro del panel de resultados.

Lo que hace el bucle es contar desde 1 hasta 10 (incluyendo 1 y 10), asigna ese número a la constante i, y ejecuta el bloque de código entre las llaves.

Si no necesitas saber en qué número estás, puedes usar un guión bajo en lugar de un nombre. Por ejemplo, podemos imprimir unas líricas de Taylor Swift así:

var str = "Fakers gonna"

for _ in 1 ... 5 {
    str += " fake"
}

print(str)

Eso mostrará "Fakers gonna fake fake fake fake fake" al añadirlo a la cadena de caracteres durante cada iteración del bucle.

Si Swift no tiene que asignar cada número a una variable en cada iteración, puede ejectuar tu código un poco más rápido. Como resultado, si escribas for i in... entonces no usabas i, Xcode sugerirá que lo cambies a _.

Hay una variante del operador de serie cerrado que solamente usa la mitad de la serie llamado operator de serie medio abierto, y es fácil confundir los dos. La de serie medio abierto mira como ..< y cuenta desde un número hasta y excluyendo otro. Por ejemplo, 1 ..< 5 contará 1, 2, 3, 4.

Recorriendo arreglos

Swift te da un método simple para recorrer todos los elementos de un arreglo. Porque Swift ya sabe que tipo de dato almacenas en tu arreglo, recorrerá cada elemento en el arreglo, asignará a una constante que digas, y entonces ejecutará un bloque de tu código. Por ejemplo, podemos imprimir una lista de canciones buenas así:

var songs = ["Shake it Off", "You Belong with Me", "Look What You Made Me Do"]

for song in songs {
    print("My favorite song is \(song)")
}

También puedes utilizar un bucle for i in para recorrer arreglos, porque puedes utilizar esta constante para indexar en un arreglo. También podemos utilizarlo para indexar en dos arreglos, así:

var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]

for i in 0 ... 3 {
    print("\(people[i]) gonna \(actions[i])")
}

Si estás preguntándote en qué casos sería importante usar el operator de serie medio abierto, la respuesta es que es particularmente útil en tareas con arreglos porque ellos empiezan en cero. Así, en vez de contar desde 0 hasta 3, contaremos desde 0 hasta excluyendo 4, o la cuenta total de los elementos del arreglo.

Recuerda: los arreglos cuentan desde cero, entonces si tienen 4 elementos, el índice máximo es 3 y necesitamos utilizar excluye en el bucle.

Para contar la cantidad de elementos en un arreglo, utiliza someArray.count. Podemos escribir nuestro código así:

var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]

for i in 0 ..< people.count {
    print("\(people[i]) gonna \(actions[i])")
}

Bucles interiores

Puedes poner bucles dentro de bucles si quieres, y más bucles dentro de bucles dentro de bucles – ¡pero ten cuidado, porque podrías descubrir que se ejecuta 10 millones de veces!

Podemos combinar los dos bucles de antes para crear eso:

var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]

for i in 0 ..< people.count {
    var str = "\(people[i]) gonna"

    for _ in 1 ... 5 {
        str += " \(actions[i])"
    }

    print(str)
}

Eso mostrará "players gonna play play play play play", luego "haters gonna..." ya lo entiendes.

Una nota importante: aunque los programadores han utilizado i, j y k traditionalmente para asignar nombres sus constantes, puedes asignarlos como quieras: for personNumber in 0 ..< people.count es perfectamente válido.

Bucles while

Hay una tercera especie de bucle que encontrarás, que repite un bloque de código hasta que le digas parar. Utiliza este para cosas como bucles de juegos cuando no sabes al comienzo cuando terminará el juego – está repitiendo "chequear por los toques, animar los robots, dibujar por la ventana, chequear por los toques..." y así, hasta que eventualmente el usuario toca al botón para salir el juego y volver al menú principal.

Estos bucles se llaman bucles while y son así:

var counter = 0

while true {
    print("Counter is now \(counter)")
    counter += 1

    if counter == 556 {
        break
    }
}

Ese código ha introducido una palabra clave nueva llamada break. Se está utilizando para salir de un bucle while o for en el punto que decides. Sin esto, el código nunca terminará porque la condición para evaluar es "cierta" siempre. Sin la palabra clave break el bucle se ejecuta como bucle infinito, cual es Una Cosa Mala.

Estos bucles while trabajan mejor en situaciones donde hay datos desconocidos, como descargando cosas de internet, leyendo de un archivo como XML, buscando por entradas de usuarios, y así. Esto es porque solamente sabes cuando parar el bucle después de que se ha ejecutado unas veces suficientes.

Hay una otra opción en vez de break llamada continue. Mientras que salir de un bucle se para la ejecutación inmediatamente y continua directamente después del bucle, un bucle que continua solamente sale de la iteración actual – volverá al comienzo del bucle y sigue ejecutandose.

Por ejemplo, considera el código:

var songs = ["Shake it Off", "You Belong with Me", "Look What You Made Me Do"]

for song in songs {
    if song == "You Belong with Me" {
        continue
    }

    print("My favorite song is \(song)")
}

Este recorre tres canciones de Taylor Swift, pero solamente mostrará los nombres de dos. A causa de la palabra clave continue, cuando el bucle trata de utilizar la canción "You Belong with Me", el programa ejecuta continue, que significa el bucle empiece al comienzo – sin ejecutando la llamada print() y sigue con "Look What You Made Me Do."

Hacking with Swift is sponsored by Essential Developer

SPONSORED Join a FREE crash course for mid/senior iOS devs who want to achieve an expert level of technical and practical skills – it’s the fast track to being a complete senior developer! Hurry up because it'll be available only until April 28th.

Click to save your free spot now

Sponsor Hacking with Swift and reach the world's largest Swift community!

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let us know!

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.