Tutorial Swift - Colecciones (Aprende a programar apps para iOS)
Tutorial Swift - Colecciones (Aprende a programar apps para iOS)

Colecciones: ARRAY, SET y DICTIONARY en Swift en Español

Colecciones en Swift: Array, Set y Dictionary son estructuras de datos que puedes usar de la librería Standard de Swift, aprende las diferencias entre Array, Set y Dictionary. También puedes crear las tuyas propias, pero la mayoría de veces tendrás suficiente en tu aplicación usando estas tres.

SwiftBeta

Tabla de contenido


👇 SÍGUEME PARA APRENDER SWIFTUI, SWIFT, XCODE, etc 👇
Aprende Swift desde cero

Swift nos proporciona 3 tipos de colecciones: Arrays, Sets y Dictionaries.
- Arrays, podemos guardar una colección de valores ordenados (ejemplo: [1, 2, 3, 1, 2, 3])
- Sets, podemos guardar una colección de valores desordenados pero únicos (ejemplo: [1, 2, 3])
- Dictionaries, podemos guardar una colección sin orden y de asociación clave-valor (ejemplo: ["name": "SwiftBeta", "surname": "Blog"])

Cuando definimos una de estas 3 colecciones, especificamos el tipo que queremos. Es decir, si creamos un array de strings, no podemos insertar un Int.

var arrayStrings = ["Swift", "Beta"]
arrayStrings.append("Blog")
Array en Swift

Si intentáramos añadir un Int a nuestro array de strings obtendríamos el siguiente error.

error: cannot convert value of type 'Int' to expected argument type 'String'
arrayStrings.append(1)
Los Array en Swift deben ser del mismo tipo

Colecciones Mutables en Swift

En el ejemplo anterior hemos mutado nuestra variable arrayStrings. Hemos podido hacerlo porque es una variable. Si hubiésemos creado una constante (con un let) hubieramos obtenido un error ya que como comentamos en uno de nuestros posts, al crear una constante no podemos modificar su valor.

Constantes y Variables en Swift
Vamos a ver como almacenar valores dentro de constantes o variables. Una vez asignado un valor a una constante no lo podemos cambiar pero en una variable podemos modificar su valor tantas veces como queramos.
Si sabemos que las colecciones no van a cambiar a lo largo del ciclo de nuestro programa, una buena práctica es crearlas inmutables . Esto nos ayuda a detectar bugs y ayuda al compilador de Swift a optimizar la performance de las colecciones que creamos.

Array en Swift

Un array almacena valores del mismo tipo en una lista ordenada. El mismo valor puede aparecer varias veces y en posiciones diferentes. Para inicializar un array podemos hacerlo de varias formas:

var arrayStrings: [String]
var arrayString: Array<String>
Especificar el tipo de un Array en Swift

Funcionalmente las dos maneras hacen lo mismo, pero es preferible usar la primera.

Crear un Array vacío

Para crear un array sin ningún elemento dentro podemos hacer:

var someInts = [Int]()
var someInts: [Int] = []

print("someInts is of type [Int] with \(someInts.count) items.")

// Prints "someInts is of type [Int] with 0 items."
Código de Array vacío en Swift

Crear Array con valor por defecto

Para inicializar un array con valores podemos hacer lo siguiente:

var arrayStrings = Array(["1", "2", "3"])
Crear Array en Swift

o una forma mucho más simple que hemos visto en otros ejemplos, es usando Array Literal

var arrayStrings = ["1", "2", "3"]
Array Literal en Swift

Esto es posible gracias a conformar el procotolo ExpressibleByArrayLiteral. Los protocolos lo veremos en futuros posts, pero te dejo más información en el siguiente enlace:

Apple Developer Documentation
Aquí podréis encontrar más información de ExpressibleByArrayLiteral

Acceder y Modificar un Array

Podemos acceder y modificar un array a través de sus métodos y propiedades

var arrayStrings = ["1", "2", "3"]

// Número de elementos en un Array
print("The arrayStrings contains \(arrayStrings.count) items.")

// Saber si un Array está vacío
if arrayStrings.isEmpty {
	print("arrayStrings is empty.")
} else {
	print("arrayStrings is not empty.")
}

// Añadir un elemento al final del Array
arrayStrings.append("4")
arrayStrings += ["5", "6"]

// También podemos insertar un elemento en una posición específica usando el siguiente método
arrayStrings.insert("7", at: 0)
// El resultado es ["7", "1", "2", "3", "4"]
Ejemplo de métodos de Array en Swift

también podemos acceder y modificar usando la sintaxis de subscript

// Para sacar el valor de un array usando subscript
var firstItem = arrayStrings[0]
// firstItem es "1"

// También podemos usar subscript para settear valores
arrayStrings[0] = "0"
// Hemos cambiado el primer valor del array a "0" (antes era 1)
Array subscript en Swift

Set en Swift

Al usar sets nos aseguramos que los valores de la colección no estén repetidos. Si intentamos meter un elemento que ya esté en la colección, Swift no lo añadirá (hará como un filtrado, como este elemento ya está dentro de la colección, no lo meteré). Podemos usar set siempre y cuando el orden no sea importante o cuando queramos asegurarnos de que el elemento no se repita.

Un ejemplo de que el orden de un set varía es si los printamos, no tienen porque tener el mismo orden en el primer print que en el segundo. Lo mismo pasa al iterar en ellos.

Para poder almacenar elementos en un set, el tipo de la colección debe ser Hashable. Es decir, debe conformar este protocolo para poder identificar cuando dos elementos son iguales. Los tipos básicos en Swift como String, Int, Double y Bool son hashseables por defecto, pero si creamos un tipo propio como User debemos conformar el protocolo Hasheable para saber cuando dos Users son idénticos. Vamos a ver un ejemplo


Crear un Set

struct User: Hashable {
    var name: String
    var age: Int
}

let swift = User(name: "SwiftBeta", age: 20)
let beta = User(name: "SwiftBeta", age: 20)

var users = Set(arrayLiteral: swift, beta)
Set en Swift

En el ejempo anterior, solo añade un elemento en el set. Aunque le pasemos las dos instancias de User, solo añadirá la primera y al intentar meter la segunda la descartará porque ya que existe un elemento en la colección con ese valor.

Hay muchos métodos similares al tipo array que se pueden usar en Set, aquí vemos unos ejemplos

Acceder y Modificar un Set en Swift

// Número de elementos en un Set
print("The users contains \(users.count) items.")

// Saber si un Set está vacío
if users.isEmpty {
    print("users is empty.")
} else {
    print("users is not empty.")
}

// Añadir un elemento
users.insert(User(name: "Blog", age: 30))

// Comprobar que Set contiene un valor
users.contains(swift)

// Borrar un elemento del Set
users.remove(swift)
Ejemplo de métodos de Set en Swift

Los array y los set son muy similares, pero cada uno tiene sus restricciones, según el escenario que tengamos nos conviene usar uno u otro.


Dictionary en Swift

Los dictonary almacenan asociaciones entre keys del mismo tipo y valores del mismo tipo. En este caso tampoco tenemos un orden. Cada valor está asociado a una única key.

La Key de un Dictionary debe ser Hasheable, como hemos visto en la sección de los Set.

Crear un Dictionary vacío en Swift

Para crear un dictionary sin ningún elemento dentro podemos hacer lo siguiente:

var citiesInformation = [String: String]()

Hemos especificado que la key debe ser de tipo String y el valor debe ser de tipo String.

Otra manera de inicializar el mismo dictionary podría ser:

var citiesNewInformation: [String: String] = [:]
Crear un Dictionary vacío en Swift

Crear Dictionary con valor por defecto Swift

Para inicializar un sictionary con valores podemos hacer lo siguiente, usando Dictionary Literal

var cityInformation = ["name": "London",
                       "coordinateX": "1.0",
                       "coordinateY": "1.0"]
Crear un Dictionary en Swift

Al tener una key y value tipo String, citiesInformation es del tipo [String: String]

Acceder y Modificar un Dictionary en Swift

var citiesInformation = ["name": "London",
                         "coordinateX": "1.0",
                         "coordinateY": "1.0"]

// Número de elementos en un Array
print("The citiesInformation contains \(citiesInformation.count) items.")

// Saber si un Array está vacío
if citiesInformation.isEmpty {
    print("citiesInformation is empty.")
} else {
    print("citiesInformation is not empty.")
}

// Añadir un elemento al Dictionary
citiesInformation["notes"] = "Beautiful City"

// Comprobar que existe una key y actualizar su valor
if let oldValue = citiesInformation.updateValue("Paris", forKey: "name") {
    print("The old value for name was \(oldValue)")
}

// Borrar el valor de una key
if let removedValue = citiesInformation.removeValue(forKey: "name") {
    print("The removed value is \(removedValue)")
}

// Para borrar el valor de una key, podemos usar subscripts y asignarle nil a la key
citiesInformation["notes"] = nil
Ejemplo de métodos de Dictionary en Swift

Vamos a usar mucho estas 3 colecciones, sobretodo de tipo array y dictionary