Der Build läuft nach dem Compiler-Update, aber die Concurrency-Diagnosen sind neu und ihre Ursache bleibt unklar.
Schnellster Weg: Ändern Sie Compiler-Version und Swift-Sprachmodus nicht gleichzeitig. Aktivieren Sie zunächst die Concurrency-Prüfung in der bestehenden Konfiguration, bearbeiten Sie die Diagnosen schrittweise pro Target und verifizieren Sie Apple-Plattform-Builds anschließend in einer passenden Remote-Mac-CI-Umgebung.
Dieser Leitfaden richtet sich an Entwickler, die Swift-Projekte auf den Sprachmodus von Swift 6 migrieren und dabei Änderungen kontrolliert eingrenzen möchten.
Er unterstützt CI-Verantwortliche, die Apple-Plattform-Ziele, Tests und Build-Artefakte auf einem Mac prüfen müssen.
Teams mit plattformübergreifenden Swift-Paketen erfahren außerdem, welche Aufgaben in der vorhandenen CI bleiben können.
Zuletzt aktualisiert am 10.10.2026. Versions- und Migrationsangaben wurden anhand der Swift-6.4-Veröffentlichungsnotiz eingeordnet. Prüfen Sie die Werkzeugkette des konkreten Projekts vor der Umstellung erneut.
[ SECTION_01 ] Vor dem ersten Änderungsschritt die drei Versionsebenen trennen
„Swift 6.4“ bezeichnet nicht automatisch den Sprachmodus aller Targets. Für eine belastbare Migration müssen Sie mindestens drei Ebenen getrennt erfassen: die tatsächlich aufgerufene Compiler-Version, den pro Target eingestellten Swift-Sprachmodus und die für Apple-Ziele benötigte Werkzeugkette. Die Migrationsdokumentation unterscheidet Compiler-Version und Sprachmodus ausdrücklich; außerdem kann ein Projekt Targets schrittweise migrieren. Die offizielle Swift-Migrationsanleitung beschreibt diese Unterscheidung.
Swift.org veröffentlichte Swift 6.4 am 15.09.2026. Diese Veröffentlichungsangabe belegt für sich genommen nicht, welche Xcode-Version Swift 6.4 enthält oder welche Compiler-Version ein bestimmter CI-Knoten verwendet. Rufen Sie deshalb auf dem ausführenden Knoten swift --version auf. Für Apple-Plattform-Aufgaben prüfen Sie zusätzlich xcodebuild -version und gleichen die konkrete Xcode-Version mit den offiziellen Xcode-Versionshinweisen ab.
| Ebene | Was Sie erfassen | Warum das für die Migration zählt |
|---|---|---|
| Compiler | Tatsächlich aufgerufene Swift-Version und deren Herkunft | Ein Update kann Diagnosen oder unterstützte Funktionen verändern, ohne den Sprachmodus jedes Targets automatisch zu ändern. |
| Sprachmodus | Einstellung für jedes einzelne Target | Ein Paket oder Projekt kann Targets mit unterschiedlichen Migrationsständen enthalten. |
| Concurrency-Prüfung | Aktivierte Prüfstufe und Diagnosen aus dem verwendeten Werkzeug | Sie sehen, wo Probleme auftreten, bevor Sie den Sprachmodus eines Targets umstellen. |
| Apple-Werkzeugkette | Xcode-Version, SDKs und gegebenenfalls Simulator-Umgebung | Ein erfolgreicher Paket-Build belegt nicht, dass ein Apple-Plattform-Target mit den benötigten SDKs gebaut und getestet wurde. |
Die Swift-6.4-Veröffentlichungsnotiz und die Swift-Kompatibilitätsdokumentation sind die geeigneten Ausgangspunkte, um Release-Informationen und Sprachkompatibilität nachzuschlagen. Leiten Sie daraus jedoch nicht ungeprüft die Ausstattung eines bestimmten CI-Images ab. Der entscheidende Beleg ist die Ausgabe des Werkzeugs, das den Build tatsächlich ausführt.
Hinweis: Legen Sie die Ausgangswerte pro Target ab. Ein einzelner Screenshot der globalen Projekteinstellungen reicht nicht, wenn Pakete, App und Tests unterschiedliche Sprachmodi oder Build-Konfigurationen verwenden.
[ SECTION_02 ] Schritt 1: Den Migrationsumfang anhand der Targets festlegen
Bevor Sie Diagnosen beheben, legen Sie fest, welche Teile des Projekts zuerst umgestellt werden sollen. Wählen Sie ein Target, das sich separat bauen und testen lässt und dessen Abhängigkeiten nachvollziehbar sind. Ein klar abgegrenztes Modul ist als Pilot besser geeignet als ein App-Target, das gleichzeitig zahlreiche interne Pakete, gemeinsam genutzte Zustände und Objective-C-Schnittstellen einbindet.
Erstellen Sie für den Pilot eine kurze Bestandsaufnahme:
- Welche Targets gehören zur ersten Migrationswelle?
- Welche Targets bleiben vorerst in ihrer aktuellen Sprachmodus-Konfiguration?
- Welche internen und externen Abhängigkeiten werden vom Pilot eingebunden?
- Wo liegen Grenzen zu Objective-C, C-APIs oder gemeinsam genutztem mutablem Zustand?
- Welche Build- und Testaufträge müssen für eine Freigabe erfolgreich sein?
Diese Erfassung ist nicht nur Dokumentation. Sie hält spätere Änderungen vergleichbar. Wenn sich Compiler, Sprachmodus, Abhängigkeiten und Tests gleichzeitig ändern, können Sie eine neue Diagnose nicht mehr zuverlässig einer Ursache zuordnen.
Muss ein Compiler-Update automatisch den Swift-6-Sprachmodus einschalten? Nein. Behandeln Sie das als getrennte Entscheidung. Prüfen Sie die Unterstützung der verwendeten Compiler-Version, dokumentieren Sie den Sprachmodus jedes Targets und schalten Sie den neuen Modus nur für den ausgewählten Pilot um. Die Swift-Migrationsstrategie erläutert, wie sich die Umstellung planen lässt.
[ SECTION_03 ] Schritt 2: Concurrency-Diagnosen in der vorhandenen Konfiguration aktivieren
Bevor Sie den Sprachmodus eines Targets ändern, erfassen Sie die Warnungen und Fehler, die die aktuelle Konfiguration bereits sichtbar macht. Verwenden Sie dafür die von der eingesetzten Werkzeugkette unterstützte Concurrency-Prüfung und halten Sie deren Einstellung im Build-Protokoll fest. Die Anleitung zur inkrementellen Migration ist dafür relevant, weil sie eine schrittweise Einführung beschreibt, statt eine projektweite Umstellung vorauszusetzen.
Ordnen Sie jede Diagnose dem Target und möglichst dem verursachenden Modul zu. Gruppieren Sie anschließend nach Themen: Isolation und Actor-Grenzen, Sendable-Anforderungen, Übergabe von Daten zwischen nebenläufigen Ausführungskontexten sowie Interaktionen mit nicht vollständig annotierten Abhängigkeiten. Die Dokumentation zu häufigen Problemen bei der Concurrency-Migration bietet hierfür eine thematische Orientierung.
Wie lässt sich Swift 6.4 schrittweise auf Concurrency-Probleme prüfen? Aktivieren Sie zuerst die verfügbare Prüfung, ohne mehrere Targets zugleich in den neuen Sprachmodus zu setzen. Speichern Sie die Diagnoseausgabe je Target, beheben Sie eine klar eingegrenzte Gruppe und wiederholen Sie denselben Build. So bleibt sichtbar, ob die Änderung tatsächlich die betreffende Diagnose beseitigt oder nur an eine andere Stelle verschiebt.
Behandeln Sie Warnungsunterdrückungen nicht als Beleg für eine abgeschlossene Migration. Eine Unterdrückung kann kurzfristig einen blockierten Build freigeben, sie erklärt aber weder die Datenübergabe noch die Isolationsgrenze. Wenn ein Fremdmodul oder eine Objective-C-Grenze die Diagnose auslöst, dokumentieren Sie die Schnittstelle, die mögliche Auswirkung und den gewählten Kompromiss. Verschieben Sie den Sprachmoduswechsel für dieses Target, wenn sich das Risiko noch nicht beurteilen lässt.
[ SECTION_04 ] Schritt 3: Diagnosen am Modulrand beheben und erneut bauen
Bearbeiten Sie den Pilot in einer nachvollziehbaren Reihenfolge. Beginnen Sie mit gemeinsam genutztem Zustand und den Stellen, an denen Daten zwischen nebenläufigen Kontexten übergeben werden. Prüfen Sie danach, ob die betroffenen Typen die benötigte Sendable-Eigenschaft tatsächlich erfüllen. Anschließend untersuchen Sie Actor-Isolation und die Aufrufgrenzen zu anderen Modulen.
Achten Sie darauf, nicht nur die Zeile mit der Diagnose zu ändern. Eine Annotation kann eine unzutreffende Annahme über Thread-Sicherheit oder Zuständigkeit ausdrücken, wenn sie ohne Prüfung eingeführt wird. Fragen Sie bei jeder Änderung:
- Welcher Code darf diesen Zustand lesen oder ändern?
- Wird der Wert kopiert, unveränderlich geteilt oder veränderlich weitergegeben?
- Ist die Modulgrenze so annotiert, dass Aufrufer die Nebenläufigkeitsgarantie erkennen?
- Können Tests den betroffenen Pfad unter der für das Projekt relevanten Werkzeugkette ausführen?
Bauen und testen Sie nach einer zusammenhängenden Änderungsgruppe erneut. Ändern Sie nicht gleichzeitig die Compiler-Version, Build-Konfiguration und Abhängigkeiten, wenn Sie den Effekt einer Concurrency-Korrektur isolieren müssen. Bei Abhängigkeiten, die noch nicht angepasst werden können, halten Sie fest, ob sie den Pilot blockieren, ob eine bewusst begrenzte Kompatibilitätslösung möglich ist oder ob das betreffende Target später migriert werden sollte.
[ SECTION_05 ] Schritt 4: Den Pilot als reproduzierbaren CI-Auftrag abbilden
Sobald der Pilot lokal oder in einer kontrollierten Entwicklungsumgebung baut, bilden Sie denselben Ablauf in CI ab. Der Auftrag sollte nicht bloß „Build erfolgreich“ melden. Speichern Sie mit dem Lauf mindestens die Compiler-Version, den Sprachmodus des Pilot-Targets, die Einstellung der Concurrency-Prüfung, relevante Diagnoseausgaben sowie die Ergebnisse der vorgesehenen Tests.
Wie migrieren Sie Swift Concurrency Target für Target in CI? Legen Sie einen eigenen Auftrag für das Pilot-Target an oder erweitern Sie eine vorhandene Pipeline so, dass dessen Konfiguration eindeutig erkennbar ist. Lassen Sie zunächst die bisherige Konfiguration als Vergleich bestehen. Erst wenn der Pilot reproduzierbar baut und seine Tests erfolgreich sind, nehmen Sie das nächste Target in die Migration auf.
Für plattformübergreifende Swift-Pakete dürfen passende Aufgaben in der vorhandenen CI-Umgebung bleiben, sofern die dortige Plattform und Werkzeugkette die jeweiligen Paketziele unterstützen. Ein erfolgreicher Paket-Test ist aber kein Nachweis für einen iOS-, macOS- oder anderen Apple-Plattform-Build. Trennen Sie deshalb in der Pipeline mindestens die Paketprüfung von Aufgaben, die Xcode, ein Apple-SDK, ein Apple-Plattform-Ziel oder eine Simulator-Umgebung voraussetzen.
Protokolle sollten ausreichend aussagekräftig, aber nicht unnötig offen sein. Prüfen Sie insbesondere, ob Umgebungsvariablen, Signierungsinformationen oder Zugangsdaten in Build-Ausgaben geraten. Beschränken Sie Zugriffsrechte auf die Personen und CI-Aufträge, die sie benötigen, und legen Sie fest, wie lange Protokolle und Artefakte aufbewahrt werden. Das ist für Datenschutz und Betriebssicherheit wichtig, besonders wenn die Migration neue Debug-Ausgaben oder zusätzliche CI-Aufträge mit sich bringt.
Erfahrungshinweis: Verwenden Sie für den Vergleich dieselbe Build- und Testdefinition. Wenn der neue Auftrag andere Abhängigkeiten lädt oder andere Umgebungsvariablen erhält, ist ein Unterschied im Ergebnis nicht automatisch auf den Sprachmodus zurückzuführen.
[ SECTION_06 ] Schritt 5: Apple-Plattform-Aufgaben auf einem passenden Remote Mac abnehmen
Ein Remote Mac wird dort relevant, wo die Pipeline eine Apple-Werkzeugkette oder ein Apple-Plattform-Ziel benötigt. Dazu zählen insbesondere Builds, die ein Apple-SDK voraussetzen, sowie Tests, die eine Simulator-Umgebung oder Xcode-spezifische Projekt- und Build-Schritte verwenden. Ob ein konkretes Ziel tatsächlich einen Mac benötigt, ergibt sich aus dem Projekt und seiner Werkzeugkette—not aus dem bloßen Umstand, dass es Swift-Code enthält.
Welche Concurrency-Migrationstests benötigen einen Mac? Paketprüfungen, die von der bestehenden Nicht-Mac-Umgebung unterstützt werden, können dort weiterlaufen. Für Apple-Plattform-Builds, Xcode-Projekte, Apple-SDK-Abhängigkeiten und erforderliche Simulator-Tests muss dagegen eine dazu passende Mac-Umgebung Teil der Abnahme sein. Kontrollieren Sie die konkrete Xcode-Version anhand der offiziellen Release-Hinweise; leiten Sie sie nicht allein aus der Swift-Version ab.
Führen Sie auf dem Remote Mac einen reproduzierbaren Ablauf durch:
- Erfassen Sie die tatsächlich installierte Compiler- und Xcode-Version.
- Prüfen Sie, ob das betreffende Target den vorgesehenen Swift-Sprachmodus verwendet.
- Bauen Sie das Apple-Plattform-Target mit den Projektvorgaben.
- Führen Sie die dafür vorgesehenen Tests aus; nutzen Sie eine Simulator-Umgebung nur, wenn der Test sie verlangt.
- Sichern Sie Build-Ausgabe, Teststatus und erzeugte Artefakte als getrennte Nachweise.
- Vergleichen Sie die Ergebnisse mit der vorher dokumentierten Baseline.
Die Swift-Migrationsdokumentation hilft bei der Sprachmodus-Einordnung; sie ersetzt jedoch nicht den Nachweis, dass die konkrete Apple-Plattform-Konfiguration mit den tatsächlich eingesetzten SDKs baut. Umgekehrt beweist ein erfolgreicher Xcode-Build allein nicht, dass sämtliche nebenläufigkeitsbezogenen Diagnosen sinnvoll behandelt wurden. Bewerten Sie deshalb Build, Tests und Diagnosen getrennt.
[ SECTION_07 ] Entscheidung: Migration erweitern, parallel weiterführen oder zurückstellen
Nutzen Sie für jedes weitere Target dieselben Vergleichskriterien. Eine Entscheidung sollte nicht allein auf einer grünen Pipeline beruhen. Prüfen Sie auch, ob die Diagnosen nachvollziehbar abgearbeitet wurden, ob die relevanten Tests ausgeführt wurden und ob ein Rückweg ohne großflächige Änderungen möglich bleibt.
- Wenn das Target isoliert gebaut werden kann, die Diagnosen verstanden sind und die vorgesehenen Tests auf der passenden Plattform erfolgreich sind, dann nehmen Sie es in die nächste Migrationswelle auf.
- Wenn nur plattformübergreifende Paketprüfungen nötig sind und die vorhandene CI diese Ziele unterstützt, dann lassen Sie diese Aufträge dort und führen Sie nicht ohne sachlichen Grund zusätzliche Mac-Stufen ein.
- Wenn Xcode, ein Apple-SDK, ein Apple-Plattform-Ziel oder eine notwendige Simulator-Prüfung beteiligt ist, dann ergänzen Sie einen passenden Mac-Auftrag, bevor Sie die Migration als abgenommen markieren.
- Wenn eine Abhängigkeit, eine Objective-C-Grenze oder ungeklärte Isolation die Diagnose nicht belastbar lösbar macht, dann halten Sie das Target vorerst im bisherigen Modus und dokumentieren Sie die offene Entscheidung.
- Wenn sich die Ergebnisse wegen geänderter Compiler-, Abhängigkeits- und Build-Konfiguration nicht vergleichen lassen, dann stellen Sie zunächst eine stabile Baseline wieder her, bevor Sie die Umstellung fortsetzen.
Die sinnvolle Bewertung ergibt sich aus den Nachweisen: Sind Compiler und Sprachmodus dokumentiert? Ist die Diagnose dem richtigen Target zugeordnet? Gibt es einen erfolgreichen Build und passende Tests für das Lieferziel? Kann das Team den Stand wiederherstellen oder gezielt zurückrollen? Erst wenn diese Fragen beantwortet sind, ist „Migration abgeschlossen“ eine belastbare Statusmeldung statt eines bloßen Compiler-Updates.
[ SECTION_08 ] Für den Mac-Anteil die passende Betriebsform wählen
Ein vorhandener Linux-CI-Knoten kann für unterstützte, plattformübergreifende Swift-Aufgaben wirtschaftlich und organisatorisch sinnvoll bleiben. Seine Grenzen zeigen sich, wenn Apple-SDKs, Xcode-Projekte oder Apple-Plattform-Tests Teil des Lieferwegs sind. Ein selbst betriebener Mac gibt dem Team direkte Kontrolle, bindet aber Budget und Betriebsaufwand auch dann, wenn die Migration nur zeitweise zusätzliche Kapazität benötigt.
| Variante | Stärken | Grenzen | Geeignet, wenn … |
|---|---|---|---|
| Vorhandene Nicht-Mac-CI | Bestehende Abläufe für unterstützte Paketprüfungen bleiben erhalten | Ersetzt keine erforderliche Apple-Werkzeugkette oder Apple-Plattform-Abnahme | Paketaufgaben plattformübergreifend ausführbar sind |
| Eigener Mac-Knoten | Direkte Kontrolle über Knoten und Wartungsabläufe | Anschaffung, Aktualisierung, Absicherung und Auslastungsplanung liegen beim Team | Ein Mac dauerhaft und planbar eingesetzt wird |
| Zeitweise gemieteter Remote Mac | Mac-Kapazität kann für einen abgegrenzten Pilot oder zusätzliche Apple-Prüfungen genutzt werden | Zugriff, Werkzeugkette, Datenschutz und Wiederholbarkeit müssen vorab geprüft werden | Die Mac-Aufgaben konzentriert oder vorübergehend anfallen |
Ein gemieteter Mac ist nicht automatisch für jedes Team die beste Dauerlösung. Bei dauerhaft hoher Auslastung, speziellen physischen Schnittstellen oder strengen Anforderungen an lokale Kontrolle kann eigene Hardware passender sein. Wenn dagegen vor allem ein abgegrenzter Migrationspilot, ein zusätzlicher Apple-Plattform-CI-Auftrag oder eine zeitweise Testumgebung fehlt, lässt sich der Bedarf zunächst kleiner halten. Informationen zur Remote-Mac-Nutzung von NOVAKVM können in diesem Fall als Grundlage für die weitere Betriebsentscheidung dienen. Für einen direkten Vergleich mit eigener Hardware ist außerdem die Entscheidung zwischen Kauf und Miete eines Mac mini relevant.
Wenn die bestehende CI für Swift-Pakete funktioniert, aber Apple-Plattform-Builds dort fehlen, ist der erste Schritt nicht zwingend ein vollständiger Wechsel der Infrastruktur. Häufig ist eine klar abgegrenzte Mac-Stufe einfacher zu bewerten als die Pflege zusätzlicher eigener Hardware: Ein eigener Knoten verursacht laufende Wartungs- und Auslastungsfragen, während eine Nicht-Mac-Umgebung die Apple-Werkzeugkette nicht ersetzt. Für einen zeitlich begrenzten Pilot kann ein Remote Mac von NOVAKVM die fehlende Ausführungsumgebung ergänzen. Bei dauerhaftem, stark ausgelastetem Betrieb oder benötigter lokaler Hardware sollten Sie dagegen zuerst die eigene Mac-Lösung prüfen.