🛡 Swift 6 trae un cambio que redefine cómo pensamos la seguridad en la concurrencia: evitar los data races antes de que sucedan. Te cuento cómo funciona este enfoque proactivo.
Swift 6
🔍 En programación, un data race (o condición de carrera) ocurre cuando dos procesos en hilos distintos intentan acceder al mismo dato al mismo tiempo. Este acceso simultáneo puede provocar una desincronización en la integridad del mismo, generando un error difícil de rastrear y fatal para nuestra app.
🏎️ Swift 6, en un esfuerzo por hacer que el código sea seguro por diseño, eleva el listón: ahora cualquier acceso a un dato que pueda provocar un data race será capturado con un error en tiempo de compilación. Y esto es fundamental: no detecta que va a ocurrir, detecta que podría suceder en esas condiciones como elemento activo de prevención.
🧩 Aquí entran en juego los actores, la herramienta principal que Swift 6 nos da para evitar estos conflictos. Los actores son clases concurrentes que gestionan el acceso a sus métodos y propiedades de forma asíncrona. Esto significa que, cuando un hilo accede a un dato dentro de un actor, cualquier otro proceso que quiera hacerlo debe esperar a que el primero termine.
🛠️ Además, con directivas como @MainActor podemos aislar datos y procesos en el hilo principal. Y con @globalActor, llevamos la concurrencia a un nivel en segundo plano donde la seguridad de los datos los ata a un hilo concreto. Unido al protocolo Sendable que garantiza que una clase es segura en sus datos para pasar estos entre distintos contextos de ejecución. Incluso herramientas de más bajo nivel incorporadas en iOS 18 como Mutex para bloquear datos.
🔄 Este enfoque proactivo y preventivo asegura que el código esté libre de condiciones de carrera en todas las situaciones potenciales, no solo en aquellas en las que el problema ya se manifiesta. Así, Swift 6 se consolida como un lenguaje donde la concurrencia ya no es un riesgo sino una funcionalidad integrada y bien controlada.
💬 ¿Te has enfrentado ya a la concurrencia estricta de Swift 6?