2026 Swift 6 concurrence stricte : Mac en location journalière et Xcode 26 propre – Sendable, @MainActor et blocages tiers en 1–3 jours
Avec Xcode 26 et la vérification complète, les avertissements CI explosent ; les retards fournisseurs se confondent avec votre modèle de threads. Cet article propose trois douleurs, une matrice décisionnelle, sept étapes, un triage, trois métriques et un planning 1–3 jours. Liens : gel WWDC et prévisualisation, CLT vs Xcode complet, FAQ SSH/VNC.
Sommaire
01. Trois douleurs
1) Poste principal « coloré » : certificats, VPN, politiques IT se mélangent aux bascules SWIFT_STRICT_CONCURRENCY et Package.resolved → journaux peu reproductibles.
2) Fournisseurs déguisent la concurrence en logique : UIImage entre acteurs, closures non-Sendable, hypothèses ObjC — sans graphe de dépendance, on oscille entre upgrade et refactor.
3) Debug OK, Archive KO : la visibilité whole-module en Release révèle des arêtes tardives ; un second Mac propre comme portail Release quotidien aide.
02. Matrice
Avec gel WWDC, isolez la piste concurrence.
| Déclencheur | Action | Valeur location |
|---|---|---|
| >200 alertes multi-modules | Geler, puis séparer dépendances / code interne | DerivedData/SPM isolés |
| Archive <72h | Gate tous les 10 correctifs + Archive nocturne | Fenêtre CPU |
| SDK binaire, vieux threads | Upgrade, fork ou adaptateur ; propriétaire du risque | Prototypes sans salir le guide de style |
| Évaluer CLT seul | CLT vs Xcode complet | Pas de désinstallation GUI locale |
03. Sept étapes
- Gel :
xcodebuild -version,swift --version,SWIFT_STRICT_CONCURRENCY, flags expérimentaux dans Markdown. - Graphe :
swift package show-dependencies --format json | head -c 8000pour le ticket. - Frontières : ViewModels @MainActor, entrée réseau, façades persistance.
- Gate : build vert
generic/platform=iOStous les dix correctifs. - Archive : miroiter les flags Release CI (
COMPILER_INDEX_STORE_ENABLE, etc.). - Preuve : xcresult, hash de diff, fuseau horaire.
- Effacement : clés, caches, FAQ.
xcodebuild -scheme YourApp -showBuildSettings | egrep 'SWIFT_STRICT_CONCURRENCY|SWIFT_VERSION'
Moins de ≈18 Go libres : index + whole-module se battent sur le disque — la lenteur est prise pour de la « complexité ».
04. Table de triage
| Symptôme | Premier geste | Erreur fréquente |
|---|---|---|
| Un module fournisseur domine | Notes de version, Swift minimal | Désactiver globalement les checks |
UIImage entre acteurs | Décodage/rendu sur @MainActor | Inonder de nonisolated(unsafe) |
| Archive seul échoue | Diff pipeline Debug/Release | Blâmer l’upload |
| Extensions avec défauts anciens | Matrice cibles : Swift + concurrence | Ne corriger que l’app |
05. Métriques, idées reçues, calendrier
- M1 : +18–35 % sur la première build complète après « complete ».
- M2 : 12–40 fichiers racine après déduplication.
- M3 : seconde machine Archive réduit les faux diagnostics d’environ 20–30 %.
Idées reçues : Sendable par remplacement massif / acteur global pour fuir / simulateur Debug suffisant — coûteux à moyen terme.
Jour 1 gel+graphe, jour 2 correctifs+gates+Archive Release, jour 3 alignement même commit puis effacement des clés.
06. Conteneurs vs Mac journalier
Le CI Linux est économique pour la statique ; index Xcode, previews UI, chemins Release proches de la signature préfèrent macOS natif. SSH pur déplace des coûts cachés (logs, trousseau).
Pour 1–3 jours avec Archives reproductibles et runbook, Apple Silicon + Xcode 26 converge plus vite. La location journalière compresse le CAPEX. Guide tarifaire, FAQ.
07. FAQ
Q : targeted pour toujours ? Construire une voie « complete » en ombre sur Mac loué avant bascule.
Q : @preconcurrency permanent ? Pont temporaire avec propriétaire, date, lien amont.
Q : Disque ? Viser 15–18 Go+ libres.