No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Consumo de la Poke API

16/27
Recursos

Aportes 2

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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 de map, podemos mapear los resultados del JSON a objetos PokemonModel 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.

Excelente clase explicado paso a paso el hacer el networking con Swift!