Bienvenido, les saluda Luis y para hoy les traigo otro tutorial.
Los Codable
protocolos son una de las adiciones recientes más geniales a Swift. A pesar de que funciona de manera similar a sus contrapartes de la comunidad Unbox
, Codable
tiene la ventaja de ser impulsado por el compilador.
Una de mis características favoritas Unbox
fue dar contexto a la operación de decodificación. Echemos un vistazo a cómo podemos lograr lo mismo con Codable
.
Ejemplo 1: otorgar valores diferentes a la misma propiedad
La decodificación con contexto se refiere a la capacidad de cambiar la forma en que se decodifican los tipos según lo que esté sucediendo en su aplicación. Digamos que nuestra aplicación está enviando una solicitud solicitando información sobre un encabezado que debería mostrarse en la pantalla, con nuestra aplicación almacenando localmente en el código un textColor
propiedad en el modelo:
Ahora, imagina la siguiente situación: ¿Y si queremos textColor
a ser diferente dependiendo de en qué pantalla se presente dicho encabezado? Por ejemplo, los encabezados en la pantalla de inicio de la aplicación podrían tener un texto verde, mientras que los encabezados en la pantalla de perfil podrían ser azules.
Hay varias formas de lograr esto, pero centrémonos en Codable
. Codable
le permite proporcionar contexto a un JSONDecoder
/JSONEncoder
a través de su userInfo
propiedad:
/// Contextual user-provided information for use during decoding. open var userInfo: [CodingUserInfoKey : Any]
El CodingUserInfoKey
es un RawRepresentable
enumeración de cadenas, por lo que puede agregar casi cualquier cosa a userInfo
. Cuando se hace esto, lo mismo userInfo
Los valores serán accesibles como parte del Decoder
/Encoder
ejemplo:
Para que esto funcione, simplemente llene el userInfo
diccionario antes de decodificar los datos.
let decoder = JSONDecoder()decoder.userInfo[HeaderInformation.textColorUserInfoKey] = UIColor.redlet headerInfo = decoder.decode(HeaderInformation.self, from: data)
CodingUserInfoKey
requiere desenvolvimiento forzado porque es RawRepresentable
, pero hacerlo nunca resultará en un bloqueo. Para ocultarlo, me gusta abstraerlo dentro de una extensión que toma un String
en lugar:
Ahora podemos usar el propio tipo CodingKeys
como el userInfo
clave, resultando en las siguientes mejoras:
let key = HeaderInformation.CodingKeys.textColor.stringValue decoder.set(context: UIColor.red, forKey: key) // textColor = decoder.getContext(forKey: CodingKeys.textColor.stringValue)
Ejemplo 2: Encendido de estructuras moduladas de tipo borrado
Un buen ejemplo de cómo uso Codable
contextos es cómo AnyRoute
funciona en la biblioteca RouterService:
En resumen, tenemos el siguiente entorno:
- Las aplicaciones pueden definir las suyas propias
Routes
, que son estructuras que se utilizan para navegar entre pantallas. - Estos
Routes
se registran en unaRouterService
instancia, que recibe dichoRoutes
y empuja los controladores de vista relacionados. Routes
se puede decodificar a partir de un formato de cadena específico, lo que permite que su back-end dicte a qué pantalla debe navegar la aplicación.
Esto último se realiza mediante AnyRoute
un Route
tipo borrado que sabe cómo decodificar dicho formato de cadena en el Route
tipo real definido por la aplicación. Pero hay un problema: debido a que AnyRoute
está definido dentro de la RouterService
biblioteca, no tiene acceso a los archivos Routes
. ¿Cómo puede decodificar el Route
tipo correcto ?
Esto se puede lograr utilizando Codable
las funciones de contexto de. Debido a Routes
que debe estar registrado en la RouterService
instancia principal , podemos inyectarlo en la operación de decodificación y hacer que determine cuál Route
debe decodificarse:
Suponiendo que RouterService
se inyectó en el JSONDecoder
, la operación de decodificación se le transferirá:
Este comportamiento descentralizado es especialmente importante para las aplicaciones modulares (que es RouterService
el caso de uso), ya que diferentes objetivos pueden referenciar y decodificar AnyRoutes
sin tener acceso al real de la aplicación Routes
.
Gracias por leer.
Añadir comentario