View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Videos

Abrir menú Cerrar menú
  • Colecciones
  • Temas
  • Todos los videos
  • Información

Más videos

  • Información
  • Resumen
  • Transcripción
  • Código
  • Novedades de Swift

    Únase para una actualización sobre Swift. Hablaremos sobre las mejoras del flujo de trabajo para que sea más productivo y sobre las API de biblioteca nuevas y modernizadas para tareas de programación fundamentales. Mostraremos ejemplos de adopción de Swift en más capas de la pila de software. Por último, exploraremos nuevas funcionalidades del lenguaje para mejorar la accesibilidad de la concurrencia y lograr el máximo rendimiento cuando lo necesites.

    Capítulos

    • 0:00 - Introducción y agenda
    • 0:48 - Actualizaciones de swiftlang
    • 3:06 - Flujo de trabajo de desarrollo: Escribir código
    • 4:40 - Flujo de trabajo de desarrollo: Desarrollo
    • 7:36 - Flujo de trabajo de desarrollo: Depuración
    • 9:14 - Bibliotecas: Subproceso
    • 10:45 - Bibliotecas: Base
    • 12:31 - Bibliotecas: Observación
    • 14:13 - Bibliotecas: Prueba
    • 16:08 - Swift en la pila: Swift integrado
    • 18:00 - Swift en la pila: Seguridad
    • 19:37 - Swift en la pila: Servidor
    • 23:23 - Swift en la pila: Plataformas
    • 26:11 - Evolución del lenguaje: Rendimiento
    • 30:28 - Evolución del lenguaje: Concurrencia
    • 37:15 - Conclusión

    Recursos

    • The Swift Programming Language
    • The Swift website
      • Video HD
      • Video SD

    Videos relacionados

    WWDC25

    • Adopción de la concurrencia en Swift
    • Codificación conjunta: Mejora una app con la concurrencia en Swift
    • Conoce la contenedorización
    • Explora la interoperabilidad de Swift y Java
    • Mejora el uso y el rendimiento de la memoria con Swift
    • Mezcle de forma segura C, C++ y Swift

    WWDC24

    • Demystify explicitly built modules
    • Explore Swift performance
    • Go small with Embedded Swift
  • Buscar este video…

    Te damos la bienvenida a Novedades de Swift. Soy Holly. Yo soy Allan. Hoy te mostraremos las nuevas funcionalidades y mejoras de Swift 6.2. Estas mejoras buscan convertirte en un mejor programador Swift, sin importar dónde o qué tipo de código escribas. Veremos las mejoras en el flujo de trabajo para escribir, compilar y depurar código. Luego veremos las nuevas API de biblioteca para tareas de programación fundamentales. También te mostraremos cómo adoptar Swift en cada capa de la pila de software. Por último, veremos nuevas funcionalidades que hacen la concurrencia accesible y permiten el máximo rendimiento. Todos los cambios que cubriremos se desarrollaron juntos en código abierto. Swiftlang en GitHub tiene más de 50 proyectos, incluido el compilador, el sitio swift.org, las bibliotecas de base y pruebas, y otros componentes clave. Además, abrimos el código fuente del sistema de compilación de Xcode llamado Swift Build. Swift Build también admite el proceso de creación para sistemas Apple. Estamos impulsando la adopción de Swift Build como el sistema de compilación del administrador de paquetes de Swift. Esto unificará el motor de compilación entre Xcode y las cadenas de herramientas de swift.org. Puedes leer más sobre Swift Build en la publicación “El futuro de las tecnologías Swift Build”. El miembro más reciente de swiftlang es el administrador de versiones Swiftly. La comunidad de código abierto lo desarrolló para mejorar la administración de herramientas Swift en Linux. Swiftly ahora es compatible con macOS y la versión 1.0 está disponible en swift.org. Con solo un comando, puedes instalar la última cadena de herramientas Swift. O instalar una instantánea nocturna desde una rama de GitHub para probar funcionalidades de lenguaje en desarrollo. En Xcode, las cadenas de herramientas instaladas por Swiftly están disponibles en el menú. Si estás creando una app, necesitas usar la cadena de herramientas de Xcode para enviarla al App Store. En VS Code, puedes seleccionar cadenas de Swiftly desde el comando Toolchain. Puedes obtener más información sobre Swiftly 1.0 en el blog de Swift. Las mejoras para usar Swift van más allá de la instalación de herramientas. Swift.org tiene una imagen y un enfoque nuevos para profundizar en apps, servicios en la nube y sistemas integrados. Este trabajo se realiza en colaboración con el grupo de trabajo del sitio web de Swift. Comenzar a usar Swift nunca fue tan fácil. Allan te mostrará cómo Swift 6.2 te brinda la flexibilidad para crear un entorno de desarrollo a tu medida. Gracias, Holly. La versión de Swift de este año presenta mejoras en los flujos de trabajo que te beneficiarán sin importar cómo programes con Swift. Estas mejoras cubren varios flujos, incluida la escritura, compilación y depuración de código. Comencemos con las novedades de este año si desarrollas en VS Code.

    La extensión Swift en el mercado de VS Code está verificada y distribuida por swift.org. El año pasado también incorporó varias funcionalidades nuevas. La primera es la indexación en segundo plano. En Swift 6.1 habilitamos esta indexación para proyectos de Swift PM en VS Code y otros IDE. Esto permite que las funcionalidades del editor se actualicen a medida que hagas cambios. El autocompletado de código en VS Code ahora es mejor gracias a las mejoras en SourceKit-LSP. La depuración también se simplificó. Ahora, la compatibilidad con LLDB se incluye al instalar la extensión de Swift. Esta versión también incluye un nuevo panel, que facilita encontrar dependencias, objetivos y tareas. La extensión VS Code de Swift también ofrece una nueva forma de ver la documentación. Puedes abrir una vista previa de DocC con el código y se actualizará en el momento. La extensión VS Code de Swift se desarrolló en código abierto y puedes encontrarla en GitHub en swiftlang. Ahora, hablemos de las mejoras en la creación de código Swift disponibles en todas partes. Una de las claves de la productividad es el rendimiento de las herramientas.

    Swift 6.2 mejora el tiempo de compilación de proyectos con API basadas en macros. Supongamos que tienes un proyecto que usa una macro de un paquete llamado Stringify. Antes, al crear proyectos, Swift PM buscaba fuentes en swift-syntax, una biblioteca que potencia las macros. Luego compilaba swift-syntax, el complemento macro Stringify y el código. Aunque se podía usar caché para swift-syntax, aún se prolongaba el tiempo de compilación limpia. Esto puede ser más notorio en un entorno de integración continua. Para acelerar la compilación, ahora Swift PM y Xcode admiten dependencias de swift-syntax preconstruidas. Esto elimina un costoso paso y reduce el tiempo de compilación limpia a minutos.

    Si tu paquete ofrece macros, tus clientes podrán aprovechar esto, siempre que el paquete dependa de una versión etiquetada de swift-syntax. Sin embargo, la productividad no siempre depende del rendimiento de la compilación. A veces, intentar resolver los problemas es lo que lo atrasa. Si escribes código concurrente en el modo de lenguaje Swift 6, el compilador detecta las condiciones de carrera que se deben evitar. Este error identifica algo importante, pero eso no significa que sea fácil solucionarlo. Por eso, en Swift 6.2 ampliamos la documentación para varias categorías de diagnósticos. Estas explicaciones de advertencias y errores comunes permiten entender el problema y ofrecen soluciones concretas. Puedes acceder a la documentación desde tu IDE y en línea en swift.org. También es importante tener control sobre el comportamiento de los diagnósticos. Para tener el código sin advertencias, usa la configuración “advertencias como errores”. Funciona bien para advertencias fáciles de abordar, pero algunas, como las de las API obsoletas, quizás no quieras resolverlas enseguida. SWIFT 6.2 te permite decidir qué advertencias tratar como errores. Puedes tratar todas las advertencias como errores por defecto, pero hacer una excepción para declaraciones obsoletas. Pero si solo quieres evitar algunas categorías, puedes cambiar esas advertencias a errores. Agregar controles para las advertencias fue un esfuerzo impulsado por la comunidad para mejorar Swift. Gracias a los autores de la propuesta y a todos los que participaron en los foros. Por último, veamos las mejoras en la depuración en Swift 6.2.

    En esta versión, mejoramos la depuración de código asincrónico. Al avanzar por el código en una tarea Swift, LLDB sigue la ejecución en funciones asincrónicas, incluso si eso requiere el cambio de subprocesos. El conocimiento de los depuradores sobre el modelo de tareas Swift permite mostrar qué tarea está activa. Incluso puedes nombrar una tarea para que sea más fácil identificarla. Los nombres aparecerán en los perfiles de instrumentos registrados con la plantilla de concurrencia. También puedes usar comandos como swift task info para obtener información sobre la tarea, su prioridad y tareas secundarias. La depuración responderá mejor gracias a los módulos creados explícitamente, una funcionalidad que permite el paralelismo y la reutilización al crear dependencias de módulos. Antes de estos módulos, la compilación y el depurador de Xcode usaban gráficos de módulos separados. Ahora el depurador puede reusar los módulos de la compilación. Por esto, la primera vez que ejecutes p o po en el depurador, el comando se evaluará rápido porque la información está disponible. Los módulos creados explícitamente están habilitados por defecto en Xcode 26. Éstas son solo algunas de las mejoras de Swift de este año. Ahora, te mostraré algunas actualizaciones importantes de las bibliotecas principales de Swift. Las bibliotecas asisten en muchas tareas, y las de Swift son clave para escribir código Swift. Swift 6.2 moderniza más API de la estructura Foundation y suma nuevas para facilitar tareas comunes. Para mejorar el uso de Swift en tareas de scripting, el Foundation Workgroup lanzó un paquete con API para ejecutar subprocesos. Comienza agregando e importando el nuevo paquete de subproceso. Luego, ejecuta un subproceso con la función run y espera el resultado. Si proporcionas una cadena con el nombre del proceso, run buscará el ejecutable según la variable de entorno $PATH.

    Iniciarás un subproceso con un FilePath para especificar la ruta completa al ejecutable. Cuando esto finaliza, puedes inspeccionar el estado de salida, la salida estándar y demás información sobre la ejecución del proceso. La biblioteca de subprocesos ofrece más capacidades para controlar la ejecución de procesos, opciones de configuración específicas de la plataforma y más. Explora la API completa en el repositorio swift-subprocess. El paquete está en la versión 0.1 y los comentarios determinarán la API de la versión 1.0. El Foundation Workgroup también mejoró las API que más se usan en proyectos de apps. Responder a notificaciones de UIKit es común en las apps para iOS, pero el código para verlas es propenso a errores. Debes asegurarte de registrarte a una notificación que el objeto emita. Si cometes un error, la devolución de notificación nunca se ejecutará. La información de la notificación está en un diccionario sin tipo, por lo que hay que acceder con la clave y convertir el resultado al tipo adecuado. Aunque la notificación se envíe en el hilo principal, pueden surgir errores de concurrencia al usar API del actor principal. Los nombres de notificación y las cargas útiles ahora admiten tipos concretos. Los tipos concretos permiten al compilador verificar que el objeto admite la notificación que estás registrando. También eliminan el texto repetitivo al trabajar con la carga útil de notificación. El tipo de notificación especifica dónde se publica la notificación. Puedes acceder a las API del actor principal si la notificación se publica en este. Una conformidad con MainActorMessage garantiza que la notificación se envíe en el hilo principal. Una conformidad con AsyncMessage indica que la notificación se envía en un hilo arbitrario. SDK incluye tipos de notificación definidos para las notificaciones que envían estructuras como UIKit y Foundation. También puedes agregar tipos concretos a tus notificaciones. La difusión de notificaciones a observadores se basa en un patrón de observador más general. La Observation Library ofrece API generales para seguir cambios de estado en un grafo de objetos.

    Puedes habilitar el seguimiento de observación en una clase con la macro @Observable. Swift 6.2 presenta una forma de transmitir cambios de estado con AsyncSequence desde un tipo observable. Primero crea una instancia del nuevo tipo de observaciones con un cierre. En el cierre, calcula el valor en el que quieres ver los cambios. Quiero ver la cadena con el estado actual del jugador y un nuevo valor cada vez que cambie la puntuación u obtenga un nuevo objeto. Tendrás un valor actualizado basado en las propiedades usadas en el cierre. Las actualizaciones se realizan de forma transaccional. El rastreo de la actualización inicia cuando las propiedades observables activan su willSet. Termina en la siguiente espera donde el código se suspende. El valor actualizado incluirá todos los cambios sincrónicos en otras propiedades entre estos dos puntos. Esto asegura que las actualizaciones síncronas de propiedades no generen observaciones con el objeto en estado inconsistente.

    Si actualizo sincrónicamente la puntuación y el objeto, solo tendré un valor actualizado con ambos cambios. El tipo de observaciones se ajusta a AsyncSequence, por lo que se puede iterar sobre los valores con for-await. Como desarrolladores, escribimos pruebas todos los días. Swift Testing es una biblioteca de macros para describir y organizar pruebas, como el atributo @Test para declarar una función de prueba. Usas las macros expect y require para validar supuestos, y Swift Testing te brinda información útil si estas fallan. A veces es difícil analizar fallos de pruebas, sobre todo en entornos remotos como CI. Para entender una falla es necesario tener más contexto sobre los datos de la prueba.

    Swift 6.2 presenta archivos personalizados para facilitar el diagnóstico de fallas en pruebas. Puedes agregar un archivo adjunto llamando al método Attachment.record. Puedes adjuntar tipos de biblioteca como Data y String, y admitir tus propios tipos con el protocolo adjuntable. También admite pruebas de salida, que permite probar el código que quieres que finalice en ciertas condiciones. Si usas precondiciones para validar suposiciones sobre parámetros de entrada, puedes escribir una prueba que pase cuando la precondición falle.

    Escribes una prueba de salida pasando processExitsWith con #expect o #require. Al escribir una prueba de salida, Swift Testing inicia un proceso para ejecutarla y permite verificar que termine con un código, una señal o un error. Estas bibliotecas permiten escribir y probar código Swift portátil en todo tu proyecto, incluso más allá del código de la app. En Apple, usamos Swift en toda nuestra pila de software. Lo usamos en firmware, apps, estructuras y servicios web a gran escala. Puedes aprovechar las mejoras de Swift 6.2 al escribir código para dispositivos integrados, componentes de seguridad y servidores. También podrás apuntar a plataformas nuevas. Empecemos por la base con Embedded Swift. Es un subconjunto que permite escribir código para entornos restringidos, como firmware para dispositivos integrados y kernels de sistemas operativos. Admite funcionalidades de Swift como valores y referencias, cierres, opcionales, manejo de errores, genéricos y más. En Apple, usamos Embedded Swift en algunos de los programas que se ejecutan en el iPhone. En iOS 26, puede ejecutarse en el coprocesador que administra el acceso a las páginas de memoria compartida entre el CPU y el GPU. Obtén más información en la sesión sobre Embedded Swift. Swift 6.2 amplía Embedded Swift con nuevas capacidades. Ahora abarca todas las API de cadenas, incluida la interpolación de cadenas. Los tipos any en Swift, que permiten representar valores de tipos que adoptan un protocolo, ahora se pueden usar si está limitado a clases. La biblioteca de Swift también incorpora InlineArray y Span, dos nuevas API para trabajar de forma eficiente con regiones de memoria. Estos tipos, que Holly cubrirá luego, son ideales para el código sensible al rendimiento de programas integrados. A medida que Swift mejora, la comunidad crea ejemplos que puedes usar para desarrollar tus proyectos integrados. Consúltalos en GitHub, en el repositorio swift-embedded-examples. Uno de los beneficios de Embedded Swift es que permite escribir software de bajo nivel en un lenguaje seguro para la memoria. El código seguro en memoria es más confiable, y mejoramos Swift para requerimientos de seguridad estrictos. A veces debes escribir código para lograr algo que no es seguro. Al integrar con una dependencia escrita en C, es común usar una API que toma punteros. En contextos críticos para la seguridad, debes evitar el código poco seguro. Si no se puede evitar, debería ser fácil de identificar. Por eso agregamos una funcionalidad opcional llamada seguridad de memoria estricta. En este modo, las API no seguras se deben reconocer explícitamente en el código fuente. Las anotaciones que requiere identifican qué partes del código necesitan atención de seguridad. Swift 6.2 también admite anotaciones para encabezados C y C++, que importan API a Swift usando tipos seguros y ergonómicos como Span. Para más detalles sobre las funcionalidades de interoperabilidad, consulta Mezcla C, C++ y Swift de forma segura. En los sistemas operativos de Apple, adoptamos la seguridad de memoria en dos componentes críticos: WebKit y un subsistema de la app Mensajes que analiza los mensajes y archivos entrantes. Ambos componentes procesan entradas no confiables, por lo que es importante limitar el uso de API no seguras. Ahora, veamos cómo usar Swift en el ecosistema del servidor.

    Swift juega un rol crucial en los servicios de Apple. Cada segundo, millones de solicitudes se procesan por servicios backend de Swift. Uno de esos se encarga de alertar a los usuarios sobre contraseñas comprometidas en filtraciones de datos. Este servicio, desarrollado con Java, se reescribió en Swift y los beneficios fueron notables. Gracias al código nativo de Swift y la gestión de memoria, el rendimiento aumentó un 40% y sus requisitos de hardware se redujeron a la mitad.

    Muchos se benefician al adoptar Swift en el servidor. Los ingenieros de Cultured Code reimplementaron el backend de la app Things, llamado Things Cloud, en Swift y contaron su experiencia en swift.org.

    En Things Cloud, usar Swift redujo los costos de cómputo a un tercio y mejoró los tiempos de respuesta en un 400%. Además del rendimiento, otro beneficio fue poder usar el mismo lenguaje y herramientas para el desarrollo del lado del cliente y del servidor. La clave para crear backends de servidor con Swift son sus bibliotecas. Swift tiene un ecosistema de paquetes con una gran variedad de casos de uso. Hay bibliotecas para redes, controladores de bases de datos, observabilidad, mensajes y más. Una actualización notable de este año fue el lanzamiento de gRPC Swift versión 2. gRPC es un paquete moderno y de alto rendimiento para crear API de servicios. Algunos puntos destacados de la versión 2 son las API modernizadas con concurrencia de Swift, código idiomático y una capa de transporte rápida. Los mantenedores de gRPC Swift escribieron en swift.org sobre la actualización. Lee el artículo para obtener más detalles. La interoperabilidad con C, Objective-C y C++ es una de las grandes fortalezas de Swift. Puedes mejorar gradualmente las bases de código en estos lenguajes adoptando Swift un archivo a la vez. En el ecosistema del servidor, muchas apps están escritas en Java, y es una oportunidad para incorporar Swift en esos proyectos. Por eso anunciamos un proyecto de código abierto llamado swift-java, para que los lenguajes interoperen sin problemas.

    Con swift-java, puedes crear enlaces que hacen que el código Swift llame al Java y viceversa. Están hechos para envolver las representaciones nativas de valores de cada idioma sin una sobrecarga excesiva. Los enlaces Java para código Swift usan la tecnología de interfaces externas de Java o recurren a JNI si es necesario. El proyecto swift-java es experimental y evoluciona rápidamente. Para obtener más información, mira la sesión Explora la interoperabilidad de Swift y Java.

    Al desarrollar apps con componentes de cliente y servidor, necesitas un flujo de trabajo para probar el código en ambos entornos de forma local. Apple lanzará una nueva biblioteca de contenedorización de código abierto para crear herramientas basadas en contenedores Linux para la Mac. La biblioteca se encuentra en Swift y se diseñó pensando en la seguridad, la privacidad y el rendimiento. Este es un gran ejemplo del uso de Swift para el desarrollo a nivel de sistemas. Para obtener más detalles, mira la sesión sobre la contenedorización. Visita el repositorio containerization de GitHub, donde hay binarios de línea de comandos para ejecutar contenedores. Ahora, veamos algunas actualizaciones de las plataformas que Swift admite. Swift 6.2 ahora admite oficialmente FreeBSD, un sistema operativo para servidores y plataformas integradas. Además, Swift admitirá WebAssembly, también conocido como Wasm. WebAssembly es una plataforma de máquinas virtuales centrada en la portabilidad, la seguridad y el alto rendimiento. Los desarrolladores pueden crear apps de cliente y servidor para Wasm e implementarlas en el navegador u otros entornos. Esto comenzó como un proyecto comunitario. A principios del año, se publicó un documento de visión para la admisión de WebAssembly en Swift. Veamos la admisión de Wasm en acción. Esta app escrita en Swift carga un modelo 3D desde un archivo y lo renderiza en el navegador. Así es como se ve la app ahora.

    La app se ejecuta en la máquina virtual de Wasm y el logo de Swift se representa con WebGPU, un estándar web experimental.

    La app usa JavascriptKit, que es un paquete de código abierto desarrollado por SwiftWasm. Puedo usar esta biblioteca para interactuar con el entorno Javascript mediante API nativas de Swift. Para reducir el tamaño del binario final, compilo la app con Embedded Swift, pero este código es un código Swift normal.

    Agregué utilidades de geometría que aprovechan los genéricos. Mi analizador de archivos Wavefront usa las API nativas de cadenas de Swift.

    Agreguemos algo de animación. Pasaré al método de actualización del renderizador.

    Para animar el modelo, la rotación del logo debe actualizarse en cada cuadro.

    Probémoslo. Para volver a ejecutar la app, activé una tarea desde el panel del proyecto. Está configurada para invocar Swift Build y compilar la app Wasm. Luego reduce el tamaño del binario con algunas herramientas de minimización sobre el resultado de la compilación. Por último, se inicia un servidor web para alojar el contenido. Se ve genial. La clave de que Swift sea una buena opción en la pila de software es que es un gran lenguaje. Swift prioriza la seguridad y la facilidad de uso por defecto, además de ofrecer herramientas para escribir código complejo y optimizar el rendimiento. Puedes aprender las funcionalidades del lenguaje a medida que lo necesites. Así, puedes empezar con lo básico y luego profundizar en funcionalidades avanzadas.

    Swift 6.2 evoluciona el lenguaje para facilitar su uso a principiantes y expertos. Creamos un camino más accesible para introducir concurrencia en un proyecto. Mejoramos el lenguaje para que los expertos escriban código crítico de alto rendimiento. Empecemos con las mejoras de rendimiento. El tipo Array es una lista ordenada de elementos y es uno de los tipos de datos más usados en proyectos Swift. Sus características, como el redimensionamiento dinámico, hacen que sea fácil de usar y útil para muchas tareas. Pero esta flexibilidad tiene un costo. Para admitir el redimensionamiento dinámico, una matriz almacena una referencia a un búfer asignado al montón. Cuando se agregan más elementos y llega a su capacidad, se asigna memoria nueva dinámicamente y se copian los elementos existentes. Si estás perfilando código crítico que usa Array en rutas de alto rendimiento, notarás asignaciones de memoria o conteo de referencias que conviene eliminar. Si el tamaño de una matriz nunca cambia, no debes pagar el costo de la asignación. Inline Array es un nuevo tipo de matriz de tamaño fijo con almacenamiento directo para sus elementos. El tamaño es parte del tipo, escrito entre corchetes angulares antes del tipo.

    En vez de usar una referencia, InlineArray almacena los elementos directamente. Esto permite guardar los elementos en la pila o dentro de otros tipos sin asignación de montón adicional. Las InlineArray pueden almacenar tipos copiables y no copiables. Al almacenar tipos copiables, InlineArray se puede copiar y los valores de los elementos se copian de inmediato. Incluir el tamaño en el tipo se logra con una función de genéricos que permite usar enteros como parámetros de tipo. Al igual que el tipo de elemento, el tamaño se puede inferir a partir de un literal de matriz. Si escribes una matriz en línea con 1, 2 y 3, el tipo se infiere como una InlineArray de 3 enteros. Saber el tamaño de una InlineArray durante la compilación permite más optimizaciones, como evitar comprobaciones de límites si el índice es menor al tamaño. Un tipo de contenedor suele necesitar ofrecer acceso directo a su almacenamiento base. Sirve para procesar memoria contigua localmente sin la necesidad de conocer el diseño del contenedor original. Una función podría operar directamente sobre el almacenamiento contiguo de una Array o una InlineArray. Antes de Swift 6.2, se usaban punteros inseguros, que son eficientes, pero poco seguros y propensos a errores.

    El nuevo tipo Span es una abstracción que ofrece acceso rápido y seguro a la memoria contigua sin comprometer la seguridad. La biblioteca estándar ofrece la propiedad span para los contenedores con almacenamiento contiguo, como Array, ArraySlice, InlineArray y otros.

    Span mantiene la seguridad de la memoria y garantiza que la memoria contigua permanezca válida mientras usas el Span. Estas garantías eliminan los problemas de seguridad de memoria, como el uso tras modificaciones superpuestas y libres. Se comprueban en la compilación sin sobrecarga de tiempo de ejecución. Modificar el contenedor original impide el acceso al span más adelante. Luego de la modificación, no podrás volver a acceder a la variable.

    Un span tampoco puede vivir más que el contenedor original. Esto se llama dependencia de vida útil y evita que el almacenamiento se destruya mientras se puede seguir accediendo a él mediante el span. Para aprender nuevas formas de optimizar el rendimiento con InlineArray y Span, mira Mejora el uso y el rendimiento de la memoria con Swift. Para obtener más información sobre el rendimiento del código Swift, consulta la sesión sobre el rendimiento de Swift.

    Otro aspecto es la capacidad de respuesta, cuando un programa realiza varias tareas al mismo tiempo. La programación concurrente es difícil porque compartir memoria entre tareas causa errores y comportamientos impredecibles. La seguridad contra condiciones de carrera en Swift 6 evita errores durante la compilación para que escribas código concurrente sin temor a introducir errores difíciles de depurar. En muchos casos, el código más natural es propenso a condiciones de carrera, lo que genera errores que debes resolver. Una clase con estado mutable como PhotoProcessor es segura mientras no se acceda concurrentemente. Tiene un método asincrónico para extraer un sticker calculando el tema de los datos de imagen dados. Pero si intentas llamar a extractSticker desde el código de la interfaz, la llamada causará condiciones de carrera. Esto pasa porque el lenguaje mueve tareas al fondo de forma implícita, incluso si nunca necesitaste que el código se ejecutara en paralelo.

    Swift 6.2 mantiene un solo hilo por defecto, hasta que decidas usar la concurrencia.

    Con los cambios de lenguaje de Swift 6.2, el código no tiene condiciones de carrera por defecto. Esto crea un camino más accesible para introducir concurrencia en un proyecto. Cuando usas concurrencia para ejecutar código en paralelo, la seguridad ante condiciones de carrera te protege. Primero, facilitamos la llamada a funciones asíncronas en tipos con estado mutable. En lugar de mover funciones asincrónicas sin un actor específico, estas seguirán ejecutándose en el actor desde el que se llamaron. Esto elimina las condiciones de carrera porque los valores que pasan a la función asíncrona nunca se envían fuera del actor. Las funciones asincrónicas pueden delegar trabajo internamente, pero los clientes no deben preocuparse por su estado mutable.

    Luego, facilitamos la implementación de conformidades en los tipos de actor principal. Tengo el protocolo Exportable y quiero implementar una conformidad para la clase StickerModel en el actor principal. El requisito de exportación no tiene aislamiento de actor, por lo que el lenguaje asumió que se podía llamar desde fuera del actor principal y evitó que StickerModel usara su estado.

    Swift 6.2 admite estas conformidades. Una conformidad aislada es aquella que necesita el estado del actor principal. Esto es seguro porque el compilador garantiza que la conformidad del actor principal solo se use en el actor principal. Puedo crear un tipo ImageExporter que agregue StickerModel a una matriz de elementos exportable, siempre que quede en el actor principal. Pero si permito que use ImageExporter desde cualquier lugar, el compilador evita agregar StickerModel a la matriz porque no es seguro hacerlo desde fuera del actor principal. Con conformidades aisladas, solo hay que resolver problemas de seguridad por condiciones de carrera cuando el código indica que usa conformidad concurrente.

    Las variables globales y estáticas son propensas a condiciones de carrera porque permiten acceder al estado mutable desde cualquier lugar.

    La forma más común de proteger el estado global es con el actor principal. Es común anotar una clase entera con el actor principal para proteger todo su estado mutable, sobre todo si el proyecto si no tiene muchas tareas simultáneas. Puedes modelar un programa completamente monohilo usando @MainActor en todo el proyecto. Para facilitar el modelado de código monohilo, introdujimos un modo que infiere el actor principal por defecto. Esto elimina errores de seguridad por variables globales y estáticas poco seguras, llamadas a otras funciones del actor principal como las del SDK y más, porque el actor principal protege todos los estados mutables. También reduce las anotaciones de concurrencia en código mayormente monohilo. Este modo es ideal para proyectos que realizan la mayor parte del trabajo en el actor principal y el código simultáneo está encapsulado en tipos o archivos específicos. Es opcional y se recomienda para apps, scripts y otros objetivos ejecutables. Descargar trabajo en segundo plano es importante para el rendimiento, para mantener la capacidad de respuesta de las apps durante tareas exigentes. Veamos la implementación del método extractSticker en PhotoProcessor. Primero verifica si ya extrajo un sticker para una imagen para devolver el sticker en caché de inmediato. Si el sticker no se guardó en caché, extrae el tema de los datos de la imagen y crea un nuevo sticker. El método extractSubject realiza un procesamiento costoso de imagen que no quiero bloquear en ningún actor. Puedo descargar el trabajo con el atributo @concurrent. @concurrent hace que las funciones se ejecuten en el grupo de subprocesos simultáneos, lo que libera al actor para ejecutar otras tareas. Juntos, estos cambios de lenguaje hacen que la concurrencia sea más accesible. Comienzas escribiendo código que se ejecuta en el actor principal, donde no hay riesgo de condiciones de carrera. Cuando comienzas a usar funciones asíncronas, estas se ejecutan desde cualquier lugar. No hay riesgo de condiciones de carrera porque el código aún se ejecuta en el actor principal. Cuando quieras adoptar la concurrencia para mejorar el rendimiento, será fácil descargar código específico en segundo plano para ejecutarlo en paralelo. Si te interesa aprender más sobre el uso de la concurrencia, consulta Mejora una app con la concurrencia en Swift. Para más detalles sobre los conceptos clave, mira la sesión sobre cómo adoptar la concurrencia en Swift. Algunos de estos cambios son opcionales porque requieren cambios en tu proyecto. Encuentra y activa todos los cambios de concurrencia en la sección Swift Compiler - Concurrency de las configuraciones de compilación de Xcode. También puedes habilitar estas funciones en un archivo de manifiesto de paquete Swift con la API SwiftSettings. Swift 6.2 tiene herramientas de migración para hacer los cambios de código necesarios automáticamente. Obtén más información sobre ellas en swift.org/migration. Estas mejoras se basaron en los comentarios sobre la adopción de seguridad de los datos en tus proyectos. Si informaste o preguntaste sobre un error, revisaste una propuesta o creaste cambios de lenguaje en los foros, tu aporte hizo la diferencia. Gracias por ayudarnos a hacer que la concurrencia sea más accesible. Si quieres ayudar a mejorar Swift, únete a nosotros en los foros de swift.org. Todos pueden contribuir al avance del lenguaje y ecosistema, nos encantaría ver tus proyectos en la sección de la comunidad. También puedes usar los foros para informarte sobre las últimas novedades de Swift: conferencias, encuentros, redes sociales y más. Gracias por acompañarnos, nos vemos en los foros.

    • 9:44 - Subprocess: Call `run` with string

      import Subprocess
      
      let result = try await run(
        .name("pwd")
      )
    • 10:04 - Subprocess: Call `run` with file path

      import Subprocess
      
      let swiftPath = FilePath("/usr/bin/swift")
      let result = try await run(
        .path(swiftPath),
        arguments: ["--version"]
      )
    • 10:05 - Subprocess: Accessing standard output

      import Subprocess
      
      let swiftPath = FilePath("/usr/bin/swift")
      let result = try await run(
        .path(swiftPath),
        arguments: ["--version"]
      )
      
      let swiftVersion = result.standardOutput
    • 10:51 - NotificationCenter: Dynamic types

      import UIKit
      
      @MainActor 
      class KeyboardObserver {
       func registerObserver(screen: UIScreen) {
          let center = NotificationCenter.default
          let token = center.addObserver(
            forName: UIResponder.keyboardWillShowNotification,
            object: screen,
            queue: .main
          ) { notification in
            guard let userInfo = notification.userInfo else { return }
            let startFrame = userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? CGRect
            let endFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect
      
            guard let startFrame, let endFrame else { return }
      
            self.keyboardWillShow(startFrame: startFrame, endFrame: endFrame)
          }
        }
        
        func keyboardWillShow(startFrame: CGRect, endFrame: CGRect) {}
      }
    • 11:34 - NotificationCenter: Concrete types

      import UIKit
      
      @MainActor
      class KeyboardObserver {
        func registerObserver(screen: UIScreen) {
          let center = NotificationCenter.default
          let token = center.addObserver(
            of: screen,
            for: .keyboardWillShow
          ) { keyboardState in
            let startFrame = keyboardState.startFrame
            let endFrame = keyboardState.endFrame
      
            self.keyboardWillShow(startFrame: startFrame, endFrame: endFrame) 
          }
        }
        
        func keyboardWillShow(startFrame: CGRect, endFrame: CGRect) {}
      }
    • 12:01 - NotificationCenter: Conformances

      extension UIResponder { 
        public struct KeyboardWillShowMessage: NotificationCenter.MainActorMessage
      }
      
      extension HTTPCookieStorage {
        public struct CookiesChangedMessage: NotificationCenter.AsyncMessage
      }
    • 12:48 - Observation: The @Observable macro

      import Observation
      
      enum Item {
        case none
        case banana
        case star
      }
      
      @Observable
      class Player {
        let name: String
        var score: Int = 0
        var item: Item = .none
      
        init(name: String) {
          self.name = name
        }
      }
    • 12:58 - Observation: The Observations type

      import Observation
      
      enum Item {
        case none
        case banana
        case star
      }
      
      @Observable
      class Player {
        let name: String
        var score: Int = 0
        var item: Item = .none
      
        init(name: String) {
          self.name = name
        }
      }
      
      let player = Player(name: "Holly")
      let values = Observations {
        let score = "\(player.score) points"
        let item =
          switch player.item {
          case .none: "no item"
          case .banana: "a banana"
          case .star: "a star"
          }
        return "\(score) and \(item)"
      }
    • 13:56 - Observation: Transactional updates

      import Observation
      
      enum Item {
        case none
        case banana
        case star
      }
      
      @Observable
      class Player {
        let name: String
        var score: Int = 0
        var item: Item = .none
      
        init(name: String) {
          self.name = name
        }
      }
      
      let player = Player(name: "Holly")
      let values = Observations {
        let score = "\(player.score) points"
        let item =
          switch player.item {
          case .none: "no item"
          case .banana: "a banana"
          case .star: "a star"
          }
        return "\(score) and \(item)"
      }
      
      player.score += 2
      player.item = .banana
    • 14:05 - Observation: AsyncSequence

      import Observation
      
      enum Item {
        case none
        case banana
        case star
      }
      
      @Observable
      class Player {
        let name: String
        var score: Int = 0
        var item: Item = .none
      
        init(name: String) {
          self.name = name
        }
      }
      
      let player = Player(name: "Holly")
      let values = Observations {
        let score = "\(player.score) points"
        let item =
          switch player.item {
          case .none: "no item"
          case .banana: "a banana"
          case .star: "a star"
          }
        return "\(score) and \(item)"
      }
      
      player.score += 2
      player.item = .banana
      
      for await value in values { print(value) }
    • 14:17 - Swift Testing

      import Testing
      import Foundation
      import EvolutionMetadataModel
      
      @Test
      func validateProposalID() async throws {
        let (data, _) = try await URLSession.shared.data(from: evolutionJSONMetadataURL)
      
        let jsonDecoder = JSONDecoder()
        let metadata = try jsonDecoder.decode(EvolutionMetadata.self, from: data)
        for proposal in metadata.proposals {
          #expect(proposal.id.starts(with: "SE"))
        }
      }
    • 14:54 - Swift Testing: Attachments

      import Testing
      import Foundation
      import EvolutionMetadataModel
      
      @Test
      func validateProposalID() async throws {
        let (data, _) = try await URLSession.shared.data(from: evolutionJSONMetadataURL) 
        Attachment.record(data, named: "evolution-metadata.json")
      
        let jsonDecoder = JSONDecoder()
        let metadata = try jsonDecoder.decode(EvolutionMetadata.self, from: data)
        for proposal in metadata.proposals {
          #expect(proposal.id.starts(with: "SE"))
        }
      }
    • 15:23 - Exit Tests: Preconditions

      extension Proposal {
        public var number: Int {
          let components = id.split(separator: "-")
          precondition(
            components.count == 2 && components[1].allSatisfy(\.isNumber),
            "Invalid proposal ID format \(id); expected SE-<Number>"
          )
      
          return Int(components[1])!
        }
      }
    • 15:34 - Exit Tests: processExitsWith argument

      import Testing
      import EvolutionMetadataModel
      
      @Test
      func invalidProposalPrefix() async throws {
        await #expect(processExitsWith: .failure) {
          let proposal = Proposal(id: "SE-NNNN")
          _ = proposal.number 
        }
      }
    • 31:06 - Concurrency: Async function error message

      class PhotoProcessor {
        func extractSticker(data: Data, with id: String?) async -> Sticker? {     }
      }
      
      @MainActor
      final class StickerModel {
        let photoProcessor = PhotoProcessor()
      
        func extractSticker(_ item: PhotosPickerItem) async throws -> Sticker? {
          guard let data = try await item.loadTransferable(type: Data.self) else {
            return nil
          }
      
          return await photoProcessor.extractSticker(data: data, with: item.itemIdentifier)
        }
      }
    • 32:06 - Concurrency: Run async functions on the caller's actor

      // Run async functions on the caller's actor
      
      class PhotoProcessor {
        func extractSticker(data: Data, with id: String?) async -> Sticker? {}
      }
      
      @MainActor
      final class StickerModel {
        let photoProcessor = PhotoProcessor()
      
        func extractSticker(_ item: PhotosPickerItem) async throws -> Sticker? {
          guard let data = try await item.loadTransferable(type: Data.self) else {
            return nil
          }
      
          return await photoProcessor.extractSticker(data: data, with: item.itemIdentifier)
        }
      }
    • 32:36 - Concurrency: Conformance error

      protocol Exportable {
        func export()
      }
      
      
      extension StickerModel: Exportable { // error: Conformance of 'StickerModel' to protocol 'Exportable' crosses into main actor-isolated code and can cause data races
        func export() {
          photoProcessor.exportAsPNG()
        }
      }
    • 33:04 - Concurrency: Isolated conformances

      // Isolated conformances
      
      protocol Exportable {
        func export()
      }
      
      
      extension StickerModel: @MainActor Exportable {
        func export() {
          photoProcessor.exportAsPNG()
        }
      }
    • 33:20 - Concurrency: Isolated conformance use

      // Isolated conformances
      
      @MainActor
      struct ImageExporter {
        var items: [any Exportable]
      
        mutating func add(_ item: StickerModel) {
          items.append(item)
        }
      
        func exportAll() {
          for item in items {
            item.export()
          }
        }
      }
    • 33:31 - Concurrency: Isolated conformance error

      // Isolated conformances
      
      nonisolated
      struct ImageExporter {
        var items: [any Exportable]
      
        mutating func add(_ item: StickerModel) {
          items.append(item) // error: Main actor-isolated conformance of 'StickerModel' to 'Exportable' cannot be used in nonisolated context
        }
      
        func exportAll() {
          for item in items {
            item.export()
          }
        }
      }
    • 33:51 - Concurrency: Unsafe static variable

      final class StickerLibrary {
        static let shared: StickerLibrary = .init() // error: Static property 'shared' is not concurrency-safe because non-'Sendable' type 'StickerLibrary' may have shared mutable state
      }
    • 34:01 - Concurrency: Protecting static variables

      final class StickerLibrary {
        @MainActor
        static let shared: StickerLibrary = .init()
      }
    • 34:05 - Concurrency: Protecting classes

      @MainActor
      final class StickerLibrary {
        static let shared: StickerLibrary = .init()
      }
    • 34:15 - Concurrency: A single-threaded program

      @MainActor
      final class StickerLibrary {
        static let shared: StickerLibrary = .init()
      }
      
      @MainActor
      final class StickerModel {
        let photoProcessor: PhotoProcessor
      
        var selection: [PhotosPickerItem]
      }
      
      extension StickerModel: @MainActor Exportable {
        func export() {
          photoProcessor.exportAsPNG()
        }
      }
    • 34:22 - Concurrency: Mode to infer main actor by default

      // Mode to infer main actor by default
      
      final class StickerLibrary {
        static let shared: StickerLibrary = .init()
      }
      
      final class StickerModel {
        let photoProcessor: PhotoProcessor
      
        var selection: [PhotosPickerItem]
      }
      
      extension StickerModel: Exportable {
        func export() {
          photoProcessor.exportAsPNG()
        }
      }
    • 35:06 - Concurrency: Explicitly offloading async work

      // Explicitly offloading async work
      
      class PhotoProcessor {
        var cachedStickers: [String: Sticker]
      
        func extractSticker(data: Data, with id: String) async -> Sticker {
            if let sticker = cachedStickers[id] {
              return sticker
            }
      
            let sticker = await Self.extractSubject(from: data)
            cachedStickers[id] = sticker
            return sticker
        }
      
        @concurrent
        static func extractSubject(from data: Data) async -> Sticker {}
      }
    • 0:00 - Introducción y agenda
    • Conoce las novedades de Swift 6.2. Los más destacado incluye: mejoras en el flujo de trabajo, nuevas API de biblioteca, adopción ampliada en toda la pila de software y funcionalidades de lenguaje de concurrencia mejoradas para una codificación más productiva.

    • 0:48 - Actualizaciones de swiftlang
    • La organización swiftlang en GitHub creció mucho y abarca más de 50 proyectos, incluido el compilador Swift, el sistema de compilación Swift Build de Xcode y el sitio web Swift.org. Swift Build, ahora de código abierto, admite el proceso de compilación para los sistemas operativos de Apple y forma parte del Swift Package Manager. Swiftly, desarrollado originalmente para Linux, ahora es compatible con macOS y simplifica la administración de la cadena de herramientas Swift. La página de inicio rediseñada Swift.org también puede ayudarte a profundizar en diferentes áreas.

    • 3:06 - Flujo de trabajo de desarrollo: Escribir código
    • La última versión de Swift mejora los flujos de trabajo de desarrollo en todas las plataformas, con mejoras específicas para los usuarios de la extensión Swift de VS Code, incluida la verificación y distribución oficial de la extensión Swift por Swift.org. También hay indexación en segundo plano para funcionalidades del editor en tiempo real, autocompletado de código mejorado, depuración simplificada con soporte automático de LLDB, un nuevo panel de proyecto y vistas previas de DocC en vivo.

    • 4:40 - Flujo de trabajo de desarrollo: Desarrollo
    • Swift 6.2 presenta varias mejoras para aumentar tu productividad. Los tiempos de compilación para proyectos que usan API basadas en macros se mejoran significativamente, ya que eliminan la necesidad de compilar la biblioteca swift-syntax durante compilaciones limpias. Esta optimización, compatible con Swift PM y Xcode, puede reducir los tiempos de compilación en minutos. Esta versión también mejora la documentación de diagnóstico del compilador debido a las explicaciones más detalladas de advertencias y errores comunes, lo que los hace más fáciles de entender y resolver. Además, tienes un mayor control sobre las advertencias del compilador; puedes especificar qué advertencias tratar como errores, una funcionalidad impulsada por la comunidad.

    • 7:36 - Flujo de trabajo de desarrollo: Depuración
    • La depuración también se mejoró en Swift 6.2, en especial para el código asincrónico, con una funcionalidad LLDB mejorada, nombres de tareas y visibilidad en los perfiles de instrumentos. También tiene tiempos de respuesta más rápidos debido a los módulos creados explícitamente habilitados de forma predeterminada en Xcode 26.

    • 9:14 - Bibliotecas: Subproceso
    • Esta versión presenta el nuevo paquete Subprocess, con el que puedes iniciar y administrar subprocesos directamente desde el código Swift. El paquete te brinda control detallado sobre la ejecución del proceso, por lo que puedes especificar la ruta ejecutable. Cuando finaliza el subproceso, puedes inspeccionar el estado de salida, la salida estándar y otra información sobre la ejecución del proceso, con la versión 0.1 ahora disponible y lista para recibir comentarios.

    • 10:45 - Bibliotecas: Base
    • A fin de mejorar el desarrollo de apps de iOS, Foundation Workgroup presentó tipos concretos para nombres de notificaciones y cargas útiles, agilizó el código, eliminó errores y mejoró la seguridad tanto para las notificaciones de la estructura como para las personalizadas. También puedes agregar tipos concretos a tus notificaciones.

    • 12:31 - Bibliotecas: Observación
    • La Observation Library de Swift usa el patrón de observador para rastrear los cambios de estado en un gráfico de objetos. La macro Observable permite el seguimiento de la observación. Swift 6.2 presenta el tipo Observations, con el que puedes crear un AsyncSequence para transmitir cambios de estado en función de un cierre que calcula un valor a partir de propiedades observables. Las actualizaciones son transaccionales, lo que garantiza un estado consistente y se pueden iterar sobre ellas mediante un bucle for-await.

    • 14:13 - Bibliotecas: Prueba
    • Al usar Swift Testing, una biblioteca multiplataforma, puedes escribir y organizar pruebas mediante el uso de macros. Swift 6.2 mejora esta capacidad con archivos adjuntos personalizados para un mejor diagnóstico de fallas, especialmente en entornos remotos, y pruebas de salida para validar el código que finaliza en condiciones específicas. Estas funcionalidades permiten probar código Swift portátil, más allá del código de tu app.

    • 16:08 - Swift en la pila: Swift integrado
    • Swift 6.2 mejora Embedded Swift y te permite escribir código para dispositivos integrados, servidores y componentes críticos para la seguridad. Ahora incluye API de cadena completa, tipos any de Swift para protocolos restringidos por clases y nuevas API, como InlineArray y Span, para trabajar de manera eficiente con regiones de memoria. Apple usa Embedded Swift en algunos de los programas de nivel más bajo del iPhone, y la comunidad creó ejemplos disponibles en GitHub en el repositorio swift-embedded-examples.

    • 18:00 - Swift en la pila: Seguridad
    • Swift 6.2 presenta el modo de seguridad de memoria estricta que requiere el reconocimiento explícito de usos inseguros de API, lo que ayuda a identificar secciones de código críticas para la seguridad. Apple está adoptando este modo en WebKit y en un subsistema de la app Mensajes, que manejan entradas no confiables.

    • 19:37 - Swift en la pila: Servidor
    • Swift se usa ampliamente en el ecosistema de servidores, particularmente en Apple, donde potencia servicios backend que procesan millones de solicitudes por segundo. Un ejemplo notable es un servicio de alerta de contraseña, desarrollado previamente en Java, con un aumento del 40% en el rendimiento y una reducción del 50% en los requisitos de hardware después de reescribirse en Swift. Otras empresas, como Cultured Code, también se beneficiaron significativamente de la adopción de Swift. El backend de Things Cloud, reimplementado en Swift, experimentó una triple reducción en los costos computacionales y una mejora del 400% en los tiempos de respuesta. El ecosistema de paquetes de Swift, la interoperabilidad con C, Objective-C y C++, y los nuevos proyectos de código abierto, como swift-java y una biblioteca de contenedorización permiten crear backends de servidor eficientes e integrar sin problemas Swift con bases de código existentes, particularmente en Java.

    • 23:23 - Swift en la pila: Plataformas
    • Swift 6.2 ahora admite oficialmente FreeBSD y WebAssembly (Wasm), lo que te permite crear apps cliente y servidor para navegadores y otros entornos de ejecución. El soporte de Wasm, que comenzó como un proyecto comunitario, permite compilar código Swift y ejecutarlo en el navegador, como se demuestra en una app de renderizado 3D que usa WebGPU y JavaScriptKit. La seguridad, la facilidad de uso y el rendimiento de Swift lo convierten en una opción atractiva en la pila de software.

    • 26:11 - Evolución del lenguaje: Rendimiento
    • La nueva versión también presenta dos nuevos tipos, InlineArray y Span, para mejorar el rendimiento del código crítico. InlineArray es una matriz de tamaño fijo que almacena elementos directamente y elimina la necesidad de asignación de montón. Esto mejora el rendimiento, especialmente en rutas activas, y permite más optimizaciones, como la eliminación de la comprobación de límites. El sistema especifica el tamaño de un InlineArray como parte del tipo y puede inferirlo a partir de literales de la matriz. Span proporciona acceso rápido y directo a la memoria contigua sin comprometer la seguridad de la memoria. Permite que las funciones operen sobre el almacenamiento subyacente de varios tipos de contenedores, como Array e InlineArray, de forma segura y eficiente. Span garantiza la validez de la memoria a través de verificaciones en tiempo de compilación, lo que evita problemas de seguridad de memoria comunes inherentes a los punteros.

    • 30:28 - Evolución del lenguaje: Concurrencia
    • La concurrencia es desafiante en la programación debido a la posibilidad de carreras de datos cuando varias tareas comparten memoria. Swift 6 presentó la seguridad de carrera de datos en el momento de la compilación, pero esto a menudo causaba errores porque el lenguaje descargaba trabajo en segundo plano implícitamente, incluso si no se necesitaba que el código se ejecutara en paralelo. Swift 6.2 soluciona este problema cambiando la filosofía predeterminada para permanecer en un subproceso hasta que se introduzca explícitamente la concurrencia. Esta capacidad, por defecto, hace que el código más natural escriba datos sin restricciones. El lenguaje ahora permite que las funciones asincrónicas que no están vinculadas a un actor continúen en el mismo actor desde el que se llamaron, lo que elimina las carreras de datos. También presenta conformidades aisladas para que los tipos de actores principales se ajusten a los protocolos y también garantiza que el compilador proteja el estado del actor principal. Ahora hay un modo opcional para inferir el actor principal de manera predeterminada y reducir las anotaciones de concurrencia en código mayoritariamente de un solo subproceso. Cuando necesitas simultaneidad para mejorar el rendimiento, como por ejemplo descargar tareas intensivas de CPU en segundo plano, Swift 6.2 proporciona herramientas para hacerlo de forma segura. El atributo concurrente garantiza que funciones específicas se ejecuten en el grupo de subprocesos simultáneos, lo que libera al actor actual para realizar tareas simultáneamente. Estos cambios funcionan juntos para hacer que la concurrencia sea más accesible y más fácil de implementar en proyectos Swift.

    • 37:15 - Conclusión
    • Los comentarios de los usuarios dieron lugar a mejoras de concurrencia en Swift y lo hicieron más fácil de usar. Se anima a la comunidad a participar en los foros en Swift.org para continuar con el desarrollo del lenguaje y el ecosistema, compartir proyectos y mantenerse al día sobre los eventos relacionados con Swift.

Developer Footer

  • Videos
  • WWDC25
  • Novedades de Swift
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines