Swift 6.2 : La concurrence enfin accessible

Publié le · 13 min

Wlad
Wlad
Fondateur & Tech Lead Swift

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 nonisolated ou @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