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
EnvironmentValues
para 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
@Environment
dentro de las vistas donde asignaste el modificador.environment
o 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.