Swift 6.2 : La concurrence enfin accessible
Annoncé à la WWDC 2025 et livré avec Xcode 26 en septembre, Swift 6.2 marque un tournant dans l'histoire de la concurrence Swift. Après des années de plaintes sur la complexité du modèle, Apple répond avec "Approachable Concurrency" : un ensemble de changements qui rendent enfin la programmation asynchrone accessible au plus grand nombre.
Le constat qui a tout changé
Soyons honnêtes : Swift Concurrency était devenu un problème. Introduit avec Swift 5.5, le modèle promettait sécurité et performance. En pratique, il imposait une courbe d'apprentissage brutale et générait des erreurs incompréhensibles même pour du code simple et mono-thread.
Le document "Improving the approachability of data-race safety" publié par l'équipe Swift reconnaît explicitement ce problème. Swift 6.2 est la réponse concrète : un ensemble de propositions coordonnées pour réduire les frictions sans sacrifier la sécurité.
Les changements principaux :
MainActor par défaut avec SE-0466
Fonctions async sur l'acteur appelant avec SE-0461
Nouvel attribut @concurrent pour l'opt-in explicite
Conformances isolées avec SE-0470
Deinit isolé avec SE-0371
MainActor par défaut : le game changer
SE-0466 est probablement le changement le plus impactant de Swift 6.2. Il permet de configurer un module entier pour qu'il s'exécute sur le MainActor par défaut, éliminant d'un coup la majorité des erreurs de concurrence dans les apps UI.
Le problème avant Swift 6.2
Avec Swift 6.2 et defaultIsolation
Dans Xcode 26, les nouveaux projets ont cette option activée par défaut. Pour les projets existants, activez-la dans Build Settings → Swift Compiler → Default Actor Isolation.
Ce que ça change concrètement
Avec defaultIsolation à MainActor, le compilateur traite tout code sans annotation explicite comme s'il était marqué @MainActor. Vos types, fonctions et propriétés s'exécutent sur le thread principal sauf indication contraire.
Quelques points importants :
Les modules externes ne sont pas affectés — ils gardent leur isolation
URLSession et autres APIs réseau continuent de fonctionner normalement
Vous pouvez toujours créer des Tasks pour du travail concurrent
L'opt-out reste possible avec
nonisolatedou@concurrent
Async sur l'acteur appelant
SE-0461 résout un problème subtil mais frustrant : les fonctions async non-isolées sautaient automatiquement sur un thread background, même quand appelées depuis le MainActor.
Avant Swift 6.2
Avec Swift 6.2
Ce comportement est activé via l'upcoming feature NonisolatedNonsendingByDefault dans Xcode 26.
@concurrent : opt-in explicite
Si vous voulez qu'une fonction s'exécute vraiment en parallèle, Swift 6.2 introduit l'attribut @concurrent pour être explicite.
Cette distinction rend le code beaucoup plus lisible : vous savez exactement quand une fonction va quitter l'acteur courant.
Conformances isolées aux global actors
SE-0470 résout un problème récurrent : comment faire conformer un type à un protocole tout en respectant l'isolation ?
Le problème
La solution avec Swift 6.2
Avec l'upcoming feature InferIsolatedConformances, Swift peut même inférer cette isolation automatiquement dans de nombreux cas.
Deinit isolé pour les acteurs
SE-0371 permet enfin de marquer les deinit comme isolés, résolvant un problème de longue date avec le nettoyage des ressources.
Sans le mot-clé isolated, le deinit n'aurait pas accès sécurisé aux propriétés de la classe.
Inline Arrays : performance compile-time
Swift 6.2 introduit les Inline Arrays, des tableaux de taille fixe dont la taille est connue à la compilation.
Les Inline Arrays sont particulièrement utiles pour l'interopérabilité C/C++ et les cas où la performance mémoire est critique.
Span : alternative sécurisée aux pointeurs
Le nouveau type Span (SE-0447) offre une vue non-propriétaire sur une région de mémoire contiguë, sans les dangers des unsafe pointers.
Span est un type non-escapable : il ne peut pas être stocké au-delà de son scope de création. Il n'est pas Sequence — l'itération se fait via indices et subscript.
Subprocess : scripts Swift simplifiés
Le nouveau package Subprocess facilite le lancement de processus externes depuis Swift.
run() est une fonction globale du module. Utilisez .name() pour un nom de commande (recherche dans PATH) ou .path() pour un chemin absolu. Le paramètre output: doit être spécifié pour collecter la sortie.
Ce package est disponible en version 0.1 et accepte les retours de la communauté.
Interopérabilité étendue
Swift 6.2 améliore significativement l'interopérabilité avec d'autres langages.
C++ amélioré
swift-java : Swift dans Java
Le projet swift-java permet d'utiliser Swift depuis du code Java, ouvrant de nouvelles possibilités pour les développeurs backend.
Migration depuis Swift 6.1
Activer Approachable Concurrency
Pour un projet Xcode existant :
- Build Settings → Swift Compiler → Upcoming Features
- Activez "Approachable Concurrency"
- Build Settings → Default Actor Isolation → MainActor
Pour un Swift Package :
Points d'attention
Certains patterns peuvent nécessiter des ajustements :
Pour aller plus loin
Swift 6.2 représente un changement de philosophie : au lieu de forcer tout le monde à comprendre la concurrence immédiatement, elle devient opt-in. Vous pouvez écrire du code Swift moderne et sécurisé sans être submergé par les concepts de threading.
Ressources officielles
Swift 6.2 Released — Blog officiel Swift.org
What's new in Swift — WWDC 2025 Session
Embracing Swift Concurrency — WWDC 2025 Session