0Pricing
Swift Academy · Lección

Composición de varios property wrappers

Apile property wrappers y comprenda su orden de inicialización.

Composición de varios property wrappers es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

Bienvenida

Se pueden aplicar varios property wrappers a una sola propiedad. El orden es importante: los wrappers externos envuelven a los internos y el orden de inicialización sigue el orden de declaración.

Encadenamiento de wrappers

```swift @propertyWrapper struct A { var wrappedValue: Int { didSet { print("A") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } @propertyWrapper struct B { var wrappedValue: Int { didSet { print("B") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } struct S { @A @B var x = 0 } ```

El wrapper externo envuelve al interno

Cuando escribe `@A @B var x`, la desazucaración es: ```swift var _x: A> = A(wrappedValue: B(wrappedValue: 0)) ``` A envuelve a B, que a su vez envuelve a Int.

Ejemplo real: @NonEmpty + @Trimmed

```swift @propertyWrapper struct Trimmed { var wrappedValue: String { didSet { wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } @propertyWrapper struct NonEmpty { var wrappedValue: String { didSet { if wrappedValue.isEmpty { wrappedValue = "(empty)" } } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.isEmpty ? "(empty)" : wrappedValue } } struct Form { @NonEmpty @Trimmed var username = " " } ```

Orden de inicialización

Los wrappers se inicializan desde el más externo hasta el más interno. Esto significa que el init del wrapper externo recibe el resultado de la transformación del wrapper interno, no el valor original.

Limitaciones del encadenamiento

• No todos los wrappers se combinan correctamente; compruebe que los tipos de `wrappedValue` coincidan • Es posible que el compilador de Swift no permita siempre varios wrappers; depende de la compatibilidad de los tipos envueltos • El acceso a `projectedValue` mediante `$x` solo llega a la proyección del wrapper más externo

Ejemplo de SwiftUI: @EnvironmentObject + Observation

SwiftUI no permite encadenar `@EnvironmentObject` y `@Published` en la misma propiedad, pero puede observar modelos `@EnvironmentObject` que usan `@Published` internamente.

Depuración de wrappers encadenados

Use `_propertyName` para acceder directamente a la instancia del wrapper: ```swift print(form._username) // A> — the outer wrapper instance ```

Alternativa: combinar dentro de un solo wrapper

A menudo resulta más sencillo combinar la lógica dentro de un único wrapper: ```swift @propertyWrapper struct CleanUsername { var wrappedValue: String { didSet { wrappedValue = clean(wrappedValue) } } func clean(_ s: String) -> String { let t = s.trimmingCharacters(in:.whitespaces) return t.isEmpty ? "(empty)" : t } } ```

Patrones prácticos de encadenamiento

Pila de wrappers válidas habituales: • `@UserDefault` + `@Published` (persistencia de datos y observación) • `@NonNegative` + `@Clamped` (capas de validación) • Específico del framework: `@Environment` + `@Binding` en vistas de SwiftUI

Comprobación rápida

Cuando se encadenan dos property wrappers, ¿cuál se inicializa primero?

Resumen

Puntos clave: • `@A @B var x` se desazucara como `A>` • El wrapper externo se inicializa usando como entrada el `wrappedValue` del interno • `$x` solo llega al `projectedValue` más externo • `_x` permite acceder directamente a la instancia del wrapper • Cuando sea posible, prefiera un único wrapper combinado a un encadenamiento profundo ¡Curso completado! Siguiente tema: el tipo Result.

Preguntas frecuentes

¿La lección «Composición de varios property wrappers» es gratis?

Sí — el texto completo de «Composición de varios property wrappers» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Composición de varios property wrappers»?

Apile property wrappers y comprenda su orden de inicialización. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Composición de varios property wrappers»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Creación de un property wrapper personalizado
  2. Valores proyectados con $binding
  3. @Published y observación en Combine
  4. Composición de varios property wrappers
← Volver a Swift Academy