Simplificando environment values con la macro Entry

Misael Cuevas
17 julio, 20243min de lectura
Durante la WWDC24, Apple presentó la macro Entry con la finalidad de simplificar la creación de EnvironmentValues personalizados. Cabe recordar que EnvironmentValues es una estructura que proporciona SwiftUI para propagar valores en las vistas a través del modificador .environment y ser utilizados mediante el property wrapper @Environment.
Un poco de historia
En el pasado, para añadir un valor en EnvironmentValues, tenías que:
- Crear una estructura que conformara el protocolo
EnvironmentKey, que sirve como llave para acceder al valor en el environment y que requiere un valor por defecto. Por ejemplo, para crear un valor que especifique un color primario:
private struct PrimaryColorKey: EnvironmentKey {static var defaultValue: Color = .black}
- Extender
EnvironmentValuespara añadir tu valor personalizado a través de una propiedad computada:
extension EnvironmentValues {var primaryColor: Color {get { self[PrimaryColorKey.self] }set { self[PrimaryColorKey.self] = newValue }}}
- Propagar tu valor personalizado en tus vistas:
ContentView().environment(\.primaryColor, .red)
- Utilizar tu valor mediante el property wrapper
@Environmentdentro de las vistas donde asignaste el modificador.environmento vistas hijas, en este ejemplo dentro de ContentView:
@Environment(\.primaryColor) var primaryColor
Actualidad
Con la macro Entry no es necesario crear una estructura que conforme el protocolo EnvironmentKey y se simplifica la creación de las propiedades computadas en la extensión de EnvironmentValues. Es decir, te ahorras el primer paso, simplificas el segundo y los demás pasos se deben seguir de igual manera. Para hacer uso de la macro, debes crear una variable marcada @Entry dentro de la extensión EnvironmentValues. Siguiendo el ejemplo anterior, para crear un valor que especifique un color primario con Entry:
extension EnvironmentValues {@Entry var primaryColor: Color = .black}
Si expandes la macro, puedes observar que esta sigue haciendo uso de EnvironmentKey y de la propiedad computada:
@Entry var primaryColor: Color = .black{get {self[__Key_primaryColor.self]}set {self[__Key_primaryColor.self] = newValue}}private struct __Key_primaryColor: SwiftUI.EnvironmentKey {typealias Value = Colorstatic let defaultValue: Value = .black}
Esto quiere decir que EnvironmentKey no está siendo marcado como obsoleto (deprecated), por lo que puedes seguir manteniendo tus EnvironmentKey mientras añades nuevos valores utilizando Entry.
Además de utilizar Entry para EnvironmentValues, también puedes usarlo para crear Transaction Values, ContainerValues y FocusedValues.
Compatibilidad
Entry puede ser utilizada a partir de las siguientes versiones de los sistemas operativos de Apple:
- iOS 13.0+.
- iPadOS 13.0+.
- Mac Catalyst 13.0+.
- macOS 10.15+.
- tvOS 13.0+.
- visionOS 1.0+.
- watchOS 6.0+.
Conclusión
La macro Entry de SwiftUI te permite simplificar significativamente la creación y gestión de valores personalizados en tu EnvironmentValues. No esperes más para mejorar tu flujo de trabajo y hacer tu código más limpio 😉.
Si no sabes lo que es una macro o quieres aprender a crear una, te recomiendo nuestro artículo sobre cómo crear tu primera macro en Swift.