Blog de Desarrollo en Swift para Plataformas Apple y Linux

Swift – Bucles

Get real time updates directly on you device, subscribe now.

En este Tutorial Swift aprenderemos sobre los bucles, esos bloques de código que nos ayudan con tareas que por naturaleza son repetitivas, ejecutando un segmento de código repetidas veces, tanto por un número específico de iteraciones o hasta que cierta condición sea lograda. Los bucles a groso modo evitan que escribamos cientos de líneas de código tedioso y repetitivo.

Hablaremos de dos tipos de bucles:

  • El bucle for
  • El bucle while

El bucle for es ideal cuando necesitamos iterar sobre una cantidad específica de elementos de una instancia o colección de instancias, cuando el número de iteraciones es tanto conocido o fácil de derivar.

El bucle while por su parte viene a ser muy útil y la elección correcta ante tareas que se ejecutan repetidas veces, tantas como cierta condición establezca.

Cada uno de estos bucles cuenta con variaciones, comencemos con el bucle for-in el cual ejecuta su bloque de código por cada elemento dentro de un rango específico, una secuencia o colección.

En caso de que no lo sepan, a partir de Swift 3 los operadores unarios ++ y así como los bucles for al estilo C ya no podrán ser implementados, de hecho ahorita el Xcode ya nos recomienda usar alternativas. Por este motivo he decidido enfocarme en un código más compatible con futuras versiones de Swift al mismo tiempo que brindo alternativas a estas dos características del lenguaje Swift que serán eliminadas.

El bucle for-in

Comencemos por analizar un ejemplo bien sencillo:

//: Playground - noun: a place where people can play

import Cocoa

var myFirstInt: Int = 0

for i in 1...5 {
    
    myFirstInt += 1
    
    print(myFirstInt)
    
} // for

…el bucle for-in no es propio de Swift, existe en muchos lenguajes de programación dada su sencillez y versatilidad. En este ejemplo contamos con la variables myFirstInt igualada a cero, para luego en la siguiente línea, tener nuestro for y la constante i, la cual solamente existe dentro del cuerpo del for y que representa el valor actual del iterador.

En el primer ciclo del bucle la constante i es igualada al primer valor del rango de 1 a 5 que hemos especificado, nuevamente vemos la sintaxis de rangos x…y, que en este bucle for-in es la fuente de valores por la cual iteraremos, en el segundo ciclo i será igual a 2 y así consecutivamente. Continuamos con la línea 9 donde aumentamos la variable myFirstInt en una unidad para acto seguido imprimirla en pantalla, la salida sería:

1
2
3
4
5

case y where

El bucle for en Swift hace gala y se vuelve protagonista de la versatilidad que caracteriza a este lenguaje de programación, permitiéndonos especificar la sentencia case y where en pos de mejorar el control sobre la manera en la que este bucle ejecuta su código.

Ciertamente el modo que más usaremos de for-in es el más sencillo, pero hay casos donde necesitamos, con tal de no complicarnos con más código, una solución elegante y limpia.

Veamos un ejemplo de uso de las sentencias case y where en conjunto con un bucle for, para esto imaginemos que necesitamos iterar sobre un conjunto de valores, digamos un rango de valores, hasta aquí todo bien, pero la cosa se complica cuando se nos informa que solamente podemos ejecutar el código del bucle por cada uno de estos números que sea múltiplo de 3.

En este punto muchas alternativas nos pueden devenir, pero de seguro una de las primeras sería la de un bucle for-in iterando sobre el rango numérico mientras un bloque if valida cada número y de ser múltiplo de 3 pues ejecutaría el código que este tendría bajo su custodia, algo así:

//: Playground - noun: a place where people can play

import Cocoa

extension Int {
    
    func format(fieldLength: String) -> String {
        
        return String(format: "%\(fieldLength)d", self)
    
    } // format

} // Int

for currentValue in 1...50 {
    
    if ((currentValue % 3) == 0) {
        
        print("El número \(currentValue.format("02")) es múltiplo de 3.")
        
    } // if
    
} // for

…la salida en pantalla sería:

El número 03 es múltiplo de 3.
El número 06 es múltiplo de 3.
El número 09 es múltiplo de 3.
El número 12 es múltiplo de 3.
El número 15 es múltiplo de 3.
El número 18 es múltiplo de 3.
El número 21 es múltiplo de 3.
El número 24 es múltiplo de 3.
El número 27 es múltiplo de 3.
El número 30 es múltiplo de 3.
El número 33 es múltiplo de 3.
El número 36 es múltiplo de 3.
El número 39 es múltiplo de 3.
El número 42 es múltiplo de 3.
El número 45 es múltiplo de 3.
El número 48 es múltiplo de 3.

Enfoquémonos en el fragmento de código que nos interesa, aquel comprendido entre las líneas 15 y 23 . Como ya comenté este sería quizás el algoritmo más dispuesto a mostrarse como primera opción y como podemos comprobar en la salida en pantalla hace su trabajo correctamente. Ahora veamos como nos pueden apoyar case y while para lograr el mismo objetivo:

for case let currentValue in 1...50 where currentValue % 3 == 0 {
    
    print("El número \(currentValue.format("02")) es múltiplo de 3.")
    
} // for

…esta actualización de nuestro bucle for al mismo tiempo que mejora la legibilidad del código, ya que a mi modo de ver, no deja dudas en cuanto a la tarea que se ejecuta dado a que la primera línea prácticamente se puede leer como una oración, pues también reduce el código pues como vemos ya no es necesario el bloque if.

Reverse

También pudiéramos haber usado (en dependencia de nuestras necesidades) el método de instancia reverse(), aquí el ejemplo anterior modificado:

//: Playground - noun: a place where people can play

import Cocoa

extension Int {
    
    func format(fieldLength: String) -> String {
        
        return String(format: "%\(fieldLength)d", self)
    
    } // format

} // Int

for currentValue in (1...50).reverse() {
    
    if ((currentValue % 3) == 0) {
        
        print("El número \(currentValue.format("02")) es múltiplo de 3.")
        
    } // if
    
} // for

…la salida en pantalla:

El número 48 es múltiplo de 3.
El número 45 es múltiplo de 3.
El número 42 es múltiplo de 3.
El número 39 es múltiplo de 3.
El número 36 es múltiplo de 3.
El número 33 es múltiplo de 3.
El número 30 es múltiplo de 3.
El número 27 es múltiplo de 3.
El número 24 es múltiplo de 3.
El número 21 es múltiplo de 3.
El número 18 es múltiplo de 3.
El número 15 es múltiplo de 3.
El número 12 es múltiplo de 3.
El número 09 es múltiplo de 3.
El número 06 es múltiplo de 3.
El número 03 es múltiplo de 3.

Con la salida en pantalla tuve un problema estético y es que los número 3, 6 y 9 en una versión inicial del código generaban que las primeras tres columnas lucieran alineadas hacia la izquierda.

Por este motivo es que he añadido un extra al código, el segmento de la línea 5 a la 13, donde extiendo el tipo de dato Int para añadirle un método / función llamado format y mediante este retorno el mismo valor de la variable pero ya formateado con la alineación y la cantidad de dígitos deseada. Las extensiones las veremos más adelante en esta serie de tutoriales.

Stride

Una función que creo merece la pena mencionar es stride(through:by) o stride(to:by) la cual nos va a permitir ir iterando por una secuencia de valores mediante salto de tantas unidades como haya sido especificado:

//: Playground - noun: a place where people can play

import Cocoa

extension Int {
    
    func format(fieldLength: String) -> String {
        
        return String(format: "%\(fieldLength)d", self)
    
    } // format

} // Int

for i in 0.stride(to: 20, by: 2) {
    
    print(i.format("02"))

} // for

…en este bucle for vamos desde 0 hasta 20 por saltos de 2 unidades, la salida del código anterior sería:

00
02
04
06
08
10
12
14
16
18

Indices

Hacer uso de índices es algo bien frecuente cuando iteramos a través de un arreglo, estos denotan la posición de un valor dentro del mismo. Esta tarea usualmente se lleva a cabo con la versión de for al estilo C, pero en el lenguaje Swift no dependemos de esta opción, también podemos hacer lo siguiente:

//: Playground - noun: a place where people can play

import Cocoa

extension Int {
    
    func format(fieldLength: String) -> String {
        
        return String(format: "%\(fieldLength)d", self)
    
    } // format

} // Int

let someNumbers = [2, 3, 45, 6, 8, 83, 100]

for (index, number) in someNumbers.enumerate() {
    
    print("\((index + 1).format("02")): \(number.format("03"))")

} // for

…la salida en pantalla:

01: 002
02: 003
03: 045
04: 006
05: 008
06: 083
07: 100

En el cabezal del for en la línea 17 hacemos uso de la función enumerate() que forma parte del protocolo SequenceType y que es implementado por los arreglos con el fin de que podamos iterar a través de ellos. Pues esta función nos devuelve el par del índice con base cero más el valor que se encuentra almacenado en el mismo. Es decir que tampoco en esta ocasión es necesario el for al estilo C.

El bucle while

En este bucle no hay mucho que comentar ya que en Swift mantiene su forma tradicional:

var intValue = 0

while intValue < 10 {
    
    print(intValue.format("02"))
    
    intValue += 1
    
} // while

…nada nuevo, nada que no se pueda deducir.

repeat while

Lo único digno a mencionar en este apartado es que la variación do-while que podemos encontrar en otros lenguajes de programación pues en Swift adopta la forma repeat-while, como se muestra en el siguiente ejemplo:

var intValue = 0

repeat {
    
    print(intValue.format("02"))
    
    intValue += 1
    
} while intValue < 10

…y eso sería todo con respecto a los bucles while.

Antes de finalizar quiero añadir que Swift cuenta con las palabras claves continue y break que vienen a permitirnos controlar el flujo de los bucles y los bloques switch, algo realmente mandatory y que se usan como en el resto de lenguajes. Me gustaría también hacer notar que no hemos necesitado hacer uso del bucle for en su estilo C, las alternativas nos han servido de manera óptima.

Falta aún mucho por aprender en nuestro camino a convertirnos en iOS Developer. Suscríbete a nuestra lista de correo mediante el formulario en el panel derecho y síguenos en nuestras redes sociales. Mantente así al tanto de todas nuestras publicaciones futuras.

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!

Get real time updates directly on you device, subscribe now.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More

RECIBE CONTENIDO SIMILAR EN TU CORREO

RECIBE CONTENIDO SIMILAR EN TU CORREO

Suscríbete a nuestra lista de correo y mantente actualizado con las nuevas publicaciones.

Se ha suscrito correctamente!