
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.
Tabla de contenido
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")
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)
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.

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>
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."
Crear Array con valor por defecto
Para inicializar un array con valores podemos hacer lo siguiente:
var arrayStrings = Array(["1", "2", "3"])
o una forma mucho más simple que hemos visto en otros ejemplos, es usando Array Literal
var arrayStrings = ["1", "2", "3"]
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:
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"]
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)
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)
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)
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 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"]
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
Vamos a usar mucho estas 3 colecciones, sobretodo de tipo array y dictionary