Aprende a usar el operador Map en Combine
Aprende a usar el operador Map en Combine

Operador en Combine: map

Dentro del framework Combine creado en Swift, podemos usar varios operadores. Cada uno de ellos tiene un propósito específico: map, filter, merge, etc. Vamos a ir viendo algunos de ellos para que los conozcas y sepas utilizarlos en tu día a día creando una app iOS.

SwiftBeta

Tabla de contenido


👇 SÍGUEME PARA APRENDER SWIFTUI, SWIFT, XCODE, etc 👇
Aprende a usar operadores en Combine
Aprende a usar operadores en Combine

Hoy en SwiftBeta vamos a aprender qué son los operadores en Combine. Hasta ahora hemos visto los Publisher y Subscribers, y hemos visto que son un pilar clave de este framework. En los próximos videos vamos a centrarnos en otro punto clave de Combine, y son los operadores y todo lo que podemos hacer con ellos. Básicamente, los operadores en Combine son métodos con un propósito específico que podemos usar en nuestros Publishers, y estos métodos están ya creados dentro del framework de Combine, tan solo debemos conocerlos y usarlos en los mejores escenarios, por ejemplo:

  • Podemos usar el operador map de Combine para transformar la información que viaja en nuestro Publisher. En el video de hoy veremos como transformar un Int que viaja por nuestro Publisher a un tipo String, que es el tipo que finalmente recibirá el Subscriber.
  • También podemos utilizar un operador llamado filter para filtrar información de nuestro Publisher
  • Incluso, podemos usar el operador merge para unir dos (o más) pubishers en uno para recibir todos los valores en un subscriber

En los próximos videos vamos a explorar distintos tipos de operadores en Combine, y hoy nos vamos a centrar en el operador map. Este operador nos permite transformar la información que viaja a través de nuestro Publisher. En los próximos videos aprenderemos sobre otros operadores e intentaré ser lo más claro posible, con elementos visuales/animaciones para que ayuden a entender qué hace el operador.

Y como siempre vamos a ver ejemplos prácticos reales.

Pero antes, si quieres apoyar el contenido que subo cada semana, suscríbete. De esta manera seguiré publicando contenido completamente grautito en Youtube.

Operador map

En este primer video sobre operadores, vamos a usar map. Lo que haremos será tranformar los valores que se publican en un Publisher de un tipo A a un tipo B. ¿Es importante saber usar map? La verdad es que es muy útil, ya que un subscriber puede esperar un tipo en concreto y el Publisher, por el motivo que sea, no se lo puede proporcionar. Pero al añadir map, podemos hacer esta transformación fácilmente, como veremos en los ejemplos de hoy.

Nuestro Publisher publicará valores de tipo Int y lo que haremos será transformar esos valores a String para que el subscriber no tenga que realizar esta lógica.

Lo primero de todo, vamos a crear nuestro Publisher de tipo PassthoughSubject, y le vamos a asignar como Output Int y como Failure Never. En este caso no permitimos que nuestro Publisher publique errores.

let intPublisher = PassthroughSubject<Int, Never>()

intPublisher.sink { value in
    print("Value \(value)")
}

intPublisher.send(35)
intPublisher.send(32)
Código creando un Publisher en Combine

Vamos a compilar nuestro Playground, y obtenemos los dos valores que hemos publicado en nuestro Publisher:

Value 35
Value 32
Valor enviados a través del Publisher en Combine

Si inspeccionamos el tipo de value, podemos observar que es de tipo Int. Pero, nosotros queremos trabajar con Strings. Podríamos hacer lo siguiente:

intPublisher
    .sink { value in
        let myString = String(value)
        print("Value \(myString)")
    }
Subscriber escuchando los valores enviados por el Publisher en Combine

Al hacerlo de esta manera, estamos añadiendo lógica dentro del closure de sink. Lo ideal sería dejar este método lo más simplificado posible y utilizar el operador map para que realice esta lógica, pero ¿cómo usamos nuestro primer operador? Muy sencillo, usamos .map y dentro, la función que queremos aplicar a todos los valores de nuestro Publisher:

let intPublisher = PassthroughSubject<Int, Never>()

intPublisher
     .map { String($0)}
     .sink { value in
         print("Value \(value)")
     }

intPublisher.send(35)
intPublisher.send(32)
Usamos el operador Map para transformar de Int a String

Acabamos de transformar los Int que viajan en nuestro Publisher a Strings. Este ejemplo, podríamos simplificarlo de la siguiente manera:

[35, 32].publisher
    .map { String($0)}
    .sink { value in
        print("Value \(value)")
    }
Podemos enviar los elementos de un Array con la propiedad Publisher en Combine
Pero como vimos en el video sobre PassthroughSubject y CurrentValueSubject, me interesa seguir usando de forma imperativa el método send, ya que es más fácil enseñar como funcionan los operadores, al enviar los valores de forma imperativa.

En el ejemplo anterior hemos transformado un Int a String. Pero hay muchos escenarios en los que te beneficiaras de este operador, por ejemplo podrías usarlo al realizar una petición HTTP y así mapear el data que recibes de la petición HTTP a un modelo de tu dominio que conforme el protocolo Decodable. Este ejemplo lo veremos en futuros videos ya que es tremendamente útil.

Acabamos de ver nuestro primer operador de Combine. Pero hay una barbaridad. En el próximo video continuaremos con otro operador.

Conclusión

Hoy en SwiftBeta hemos visto un operador muy útil que nos permite tranformar los valores que se publican dentro de un Publisher. Este operador puede transformar de un tipo A a un tipo B solo pasando una función que se encarga precisamente de esto. Tiene un parámetro de entrada y un valor de retorno.

Y hasta aquí el video de hoy.