Map es una forma de manejar datos cuya implementación nos permitirá tomar una secuencia de valores (como por ejemplo un Array) y producir uno nuevo.
func hashtags(in string: String) -> [String] {
let words = string.components(
separatedBy: .whitespacesAndNewlines
)
let tags = words.filter { $0.starts(with: "#") }
// Con map tomamos todas las palabras/hashtags y hacemos un nuevo array
return tags.map { $0.lowercased() }
}
Incluso podríamos utilizar una función como la anterior para crear un nuevo array utilizando también .map()
// Tengo un nuevo array
let strings = [
"I'm excited about #SwiftUI",
"#Combine looks cool too",
"This year's #WWDC was amazing"
]
/* Mapeo el array string haciendo uso del método anterior que me permite
conseguir los hashtags y se almacena en una nueva variable creando un nuevo
array */
let tags = strings.map(hashtags)
print(tags) // [["#swiftui"], ["#combine"], ["#wwdc"]]
💡 Ahora es importante ver el resultado del ejemplo previo. Porque .map()
nos generará un nuevo array que contiene un array de valores, por lo que quedan dos arrays anidados.
Tomando la advertencia previa es posible que lo que queremos no sea un array anidado si no un array con los valores que necesitamos y para ello es bueno .flatMap() cuyo resultado es similar al previo pero devuelve un array simple
let tags = strings.flatMap(hashtags)
print(tags) // ["#swiftui", "#combine", "#wwdc"]
También es posible utilizar withAnimation -por ejemplo- en la acción de un botón que realice toggle para mostrar o no una pantalla de forma que, la pantalla se muestre de una forma más dinámica.
Button {
withAnimation {
dataModel.showStats.toggle()
}
} label: {
Image(systemName: "chart.bar")
}
// Otro ejemplo
Button("Press here") {
withAnimation {
opacity -= 0.2
}
how-to-create-an-explicit-animation-1.mp4
El comportamiento de .compactMap()
sigue siendo similar al de .flatMap()
en el sentido que devuelve un array simple. Sin embargo, también nos ayudará a descartar valores que sean nil
/* Si queremos un nuevo array solo con valores Int, "notANumber" sería un nil
con compactMap se descarta automáticamente */
let numbers = ["42", "19", "notANumber"]
let ints = numbers.compactMap { Int($0) }
print(ints) // [42, 19]