El @State de SwiftUI ahora es un macro, y Xcode 27 romperá algunas de sus compilaciones

WWDC 2026 quedó atrás, las betas de iOS 27 y Xcode 27 ya están disponibles, y la mayor parte de la cobertura se centró en Liquid Glass con su nuevo control de tinte y en una Siri más inteligente. Esa es la historia para el consumidor. La historia para el desarrollador es más concreta, y comienza con tres caracteres que escribe en casi cada vista de SwiftUI: @State.
A partir de Xcode 27, @State ya no es un property wrapper conforme a DynamicProperty. Ahora es un macro de Swift. Apple realizó un back-deploy del nuevo comportamiento a iOS 17, macOS 14, tvOS 17, watchOS 10 y visionOS 1, por lo que no necesita elevar su deployment target para obtenerlo. Si compila el mismo código con Xcode 26, SwiftUI seguirá usando el property wrapper antiguo. La ventaja práctica: las clases almacenadas en @State ahora se inicializan de forma perezosa, una vez por vida útil de la vista, en lugar de asignarse en cada re-inicialización.
Esa parte es buena. El problema es que un patrón común deja de compilar. Si establece un valor predeterminado en la declaración y luego asigna un valor diferente en init, Xcode 27 lo bloquea con un error grave:
struct ProfileView: View {
@State private var name = "Guest" // default here
init(user: User) {
name = user.displayName // reassigned here -> error in Xcode 27
}
}Antes, eso usaba silenciosamente el valor incorrecto. Ahora es un error de «variable usada antes de ser inicializada». Trivial en una sola vista, pero es exactamente el tipo de cosa que se esconde en decenas de vistas a lo largo de una aplicación madura.
Los plazos matemáticos están a su favor
Aquí es donde los equipos se equivocan. Unos entran en pánico y otros lo ignoran, y ninguna de las dos opciones es correcta.
El mínimo de envío de Apple no ha cambiado. Desde el 28 de abril de 2026, App Store Connect solo requiere que compile con Xcode 26 y el SDK de iOS 26. No hay ningún plazo anunciado que le obligue a pasarse al SDK de iOS 27, así que no tiene prisa para lanzar con iOS 27.
Pero «sin plazo» no significa «sin trabajo». El error de @State es un fallo de compilación, y los fallos de compilación son más baratos de corregir cuando los busca activamente, no cuando el tren de lanzamiento de septiembre ya está en marcha. En nuestros proyectos nativos de iOS y Android hemos aprendido la misma lección más de una vez: la migración que usted programa es tranquila; la migración que llega encima de un lanzamiento es un caos.
El movimiento que puede hacer hoy: añada un carril de Xcode 27 beta a su CI y deje que compile con la nueva cadena de herramientas ahora mismo. No tiene que lanzar lo que produzca. Solo quiere que la X roja aparezca en un pull request en julio, no en una rama de hotfix en otoño. Ya que está, haga un grep en su código para encontrar declaraciones de @State que tengan un valor predeterminado y se reasignen en un inicializador. Esa es su lista de correcciones, y es finita.
Los cambios más discretos que merecen su atención
@State se lleva el titular, pero otras pocas actualizaciones de SwiftUI cambian la forma en que construiríamos las cosas.
AsyncImage ahora hace caché HTTP de forma predeterminada. Respeta los encabezados de caché del servidor sin cambios de código, así que desplazarse por una lista dos veces ya no vuelve a descargar las mismas imágenes. Construimos aplicaciones con gran cantidad de imágenes en el sector del comercio electrónico y la sanidad, y una buena parte de los errores de «¿por qué esta lista va lenta?» se remontan a una carga de imágenes ingenua. El almacenamiento en caché gratuito es bienvenido, con una advertencia de nuestro trabajo de infraestructura y seguridad: el caché es tan bueno como sus encabezados. Si su CDN u origen envía valores de Cache-Control débiles, no almacenará nada en caché o lo almacenará demasiado tiempo. Cuando configuramos Cloudflare para los clientes, los encabezados de caché son una superficie de configuración real que ajustamos deliberadamente, no una ocurrencia tardía. La misma disciplina se aplica aquí.
También hay un nuevo modelo de documentos. SwiftUI añade los protocolos WritableDocument y ReadableDocument con acceso a disco asíncrono e incremental, y las escrituras ahora usan diferencias basadas en snapshots para que un DocumentWriter guarde solo las partes que cambiaron. Si mantiene una aplicación basada en documentos, ese es un verdadero punto de mejora de rendimiento para archivos grandes. Los contenedores reordenables son el otro toque agradable: ahora las personas pueden arrastrar para reorganizar elementos en cualquier contenedor, no solo en List, usando el mismo código en List y LazyVStack.
En cuanto a las herramientas, Swift 6.3 y 6.4 se publicaron juntas en la beta de Xcode 27. El cambio que más sentirán los equipos es la interoperabilidad bidireccional entre Swift Testing y XCTest. Puede llamar a las aserciones de XCTest desde una prueba de Swift Testing y el proceso inverso también funciona ahora. En el modo limitado predeterminado, los problemas entre frameworks aparecen como advertencias; actualice su paquete a swift-tools-version: 6.4 para el modo completo. Si ha estado posponiendo Swift Testing porque su suite de XCTest es grande, esa fricción ya casi no existe. Escriba su próxima prueba en Swift Testing y deje las antiguas donde están.
Lo que le diríamos a un equipo esta semana
Pruebe con Xcode 27 ahora, lance con iOS 26 como ya hace. Trate el error de @State como una tarea programada, no como una emergencia. Audite su caché de imágenes mientras tiene AsyncImage en mente, y empiece a escribir nuevas pruebas en Swift Testing. Nada de esto es urgente en el calendario de Apple. Todo es más barato en julio que en septiembre.
Hemos migrado muchas bases de código de móvil y web a través de exactamente este tipo de salto de cadena de herramientas sin un simulacro de incendio en la semana de lanzamiento, y puede ver el tipo de trabajo que hacemos en nuestros proyectos anteriores.
Si le resulta familiar el proceso de llevar una gran aplicación SwiftUI a través de los cambios de compilación de Xcode 27 antes del apretado lanzamiento de otoño, hablemos.