Utilizando compactMap
en lugar de map
en la función parseJSON
En el código de ejemplo proporcionado, se utiliza compactMap
en lugar de map
al mapear los resultados del JSON a objetos de modelo de Pokémon. Aquà se argumenta por qué se eligió compactMap
en esta situación.
La función compactMap
es una variante de map
que tiene la ventaja de eliminar los elementos nulos (opcionalmente en este caso) del resultado final. En el contexto de este código, la intención es mapear los resultados del JSON a objetos PokemonModel
, pero solo se deben incluir aquellos resultados que tienen tanto un nombre como una URL válida.
Al utilizar compactMap
en lugar de map
, podemos aprovechar la capacidad de compactMap
para filtrar automáticamente los elementos nulos del resultado. Esto evita la necesidad de realizar una operación de filtrado separada después del mapeo inicial.
En el código de ejemplo, dentro del closure de compactMap
, se realiza una verificación condicional para asegurarse de que tanto el nombre como la URL sean no nulos. Si alguna de estas propiedades es nula, se devuelve nil
. Esto garantiza que solo se incluyan en el resultado final los objetos PokemonModel
que tengan tanto un nombre como una URL válida.
En resumen, al utilizar
compactMap
en lugar demap
, podemos mapear los resultados del JSON a objetosPokemonModel
y, al mismo tiempo, filtrar automáticamente los resultados nulos. Esto mejora la legibilidad del código y evita la necesidad de realizar una operación de filtrado separada.
func parseJSON(pokemonData: Data) -> [PokemonModel]? {
let decoder = JSONDecoder()
do {
let decodeData = try decoder.decode(PokemonData.self, from: pokemonData)
let pokemon = decodeData.results?.compactMap({
if let name = $0.name, let imageURL = $0.url {
return PokemonModel(name: name, imageURL: imageURL)
}
return nil
})
return pokemon
} catch {
return nil
}
}
¿La solución que utiliza compactMap
en lugar de map
en el código proporcionado es eficiente?
En cuanto a la legibilidad, el uso de compactMap
permite realizar la transformación y el filtrado en una sola operación, lo cual hace que el código sea más conciso y fácil de entender. Al utilizar la clausura de compactMap
para verificar y descartar los elementos nulos, se evita la necesidad de escribir una operación de filtrado separada después del mapeo inicial.
En términos de rendimiento, el uso de compactMap
es eficiente ya que realiza el mapeo y filtrado en una sola pasada sobre la colección de resultados. Esto significa que no se necesita iterar dos veces sobre la colección, primero para el mapeo y luego para el filtrado. Además, compactMap
aprovecha el mecanismo interno de optimización de Swift para evitar asignar memoria adicional para los elementos nulos que se descartan.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?