Communitygithub.com

Swift 6.2 Zugängliche Nebenläufigkeit

Swift 6.2 Nebenläufigkeit – standardmäßig single-threaded, @concurrent für explizites Auslagern in den Hintergrund, isolierte Konformitäten für MainActor-Typen. Verwenden bei der Adoption von Swift 6.2 Nebenläufigkeit – Auslagern mit @concurrent oder Auflösen von MainActor-Isolation.

Was ist Swift 6.2 Zugängliche Nebenläufigkeit?

Dieses Skill dokumentiert das 'Approachable Concurrency'-Modell von Swift 6.2, bei dem Code standardmäßig single-threaded läuft und Nebenläufigkeit explizit eingeführt wird. Es adressiert häufige Datenwettlauf-Fehler ohne Leistungseinbußen. Der Skill unterstützt Plattformen wie Xcode 26 und Swift Package Manager und erklärt Kernmuster wie isolierte Konformitäten für MainActor-Typen, den Schutz globaler/statischer Variablen mit MainActor sowie der Einsatz von `@concurrent` für CPU-intensive Hintergrundarbeit. Er bietet eine Migrationsanleitung von Swift 5.x/6.0/6.1, Best Practices und Anti-Patterns und empfiehlt die schrittweise Aktivierung der Baueinstellungen für einen nicht-brechenden Übergang. Entwickler lernen, wie sie Datenwettläufe durch Compiler-Erkennung vermeiden und `@concurrent` als bewusste Performance-Entscheidung einsetzen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/swift-concurrency-6-2

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Swift 6.2 Zugängliche Nebenläufigkeit?

Muster für die Übernahme des Nebenläufigkeitsmodells von Swift 6.2, bei dem Code standardmäßig single-threaded läuft und Nebenläufigkeit explizit eingeführt wird. Beseitigt häufige Datenwettlauf-Fehler ohne Leistungseinbußen.

Wann aktivieren

  • Migration von Swift 5.x oder 6.0/6.1 Projekten zu Swift 6.2
  • Behebung von Compiler-Fehlern zur Datenwettlaufsicherheit
  • Entwurf von MainActor-basierter App-Architektur
  • Auslagern von CPU-intensiver Arbeit in Hintergrundthreads
  • Implementierung von Protokollkonformitäten auf MainActor-isolierten Typen
  • Aktivieren der Baueinstellungen für Zugängliche Nebenläufigkeit in Xcode 26

Kernproblem: Implizites Auslagern in den Hintergrund

In Swift 6.1 und früher konnten asynchrone Funktionen implizit in Hintergrundthreads ausgelagert werden, was selbst in scheinbar sicherem Code Datenwettlauf-Fehler verursachte:

// Swift 6.1: FEHLER
@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 }

        // Fehler: Senden von 'self.photoProcessor' riskiert Datenwettläufe
        return await photoProcessor.extractSticker(data: data, with: item.itemIdentifier)
    }
}

Swift 6.2 behebt dies: Async-Funktionen bleiben standardmäßig auf dem aufrufenden Actor.

// Swift 6.2: OK – async bleibt auf MainActor, kein Datenwettlauf
@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)
    }
}

Kernmuster — Isolierte Konformitäten

MainActor-Typen können nun sicher mit nicht-isolierten Protokollen konform gehen:

protocol Exportable {
    func export()
}

// Swift 6.1: FEHLER – Übergang in MainActor-isolierten Code
// Swift 6.2: OK mit isolierter Konformität
extension StickerModel: @MainActor Exportable {
    func export() {
        photoProcessor.exportAsPNG()
    }
}

Der Compiler stellt sicher, dass die Konformität nur auf dem MainActor verwendet wird:

// OK – ImageExporter ist ebenfalls @MainActor
@MainActor
struct ImageExporter {
    var items: [any Exportable]

    mutating func add(_ item: StickerModel) {
        items.append(item)  // Sicher: gleiche Actor-Isolation
    }
}

// FEHLER – nicht-isolierter Kontext kann MainActor-Konformität nicht verwenden
nonisolated struct ImageExporter {
    var items: [any Exportable]

    mutating func add(_ item: StickerModel) {
        items.append(item)  // Fehler: MainActor-isolierte Konformität kann hier nicht verwendet werden
    }
}

Kernmuster — Globale und statische Variablen

Schützen Sie globalen/statischen Zustand mit MainActor:

// Swift 6.1: FEHLER – nicht-sendbarer Typ kann veränderlichen gemeinsamen Zustand haben
final class StickerLibrary {
    static let shared: StickerLibrary = .init()  // Fehler
}

// Lösung: Mit @MainActor annotieren
@MainActor
final class StickerLibrary {
    static let shared: StickerLibrary = .init()  // OK
}

MainActor-Standard-Inferenz-Modus

Swift 6.2 führt einen Modus ein, in dem MainActor standardmäßig inferiert wird – keine manuellen Annotationen erforderlich:

// Mit aktivierter MainActor-Standard-Inferenz:
final class StickerLibrary {
    static let shared: StickerLibrary = .init()  // Implizit @MainActor
}

final class StickerModel {
    let photoProcessor: PhotoProcessor
    var selection: [PhotosPickerItem]  // Implizit @MainActor
}

extension StickerModel: Exportable {  // Implizit @MainActor-Konformität
    func export() {
        photoProcessor.exportAsPNG()
    }
}

Dieser Modus ist optional und wird für Apps, Skripte und andere ausführbare Ziele empfohlen.

Kernmuster — @concurrent für Hintergrundarbeit

Wenn Sie echten Parallelismus benötigen, lagern Sie explizit mit @concurrent aus:

Wichtig: Dieses Beispiel erfordert die Baueinstellungen für Zugängliche Nebenläufigkeit – SE-0466 (MainActor-Standardisolation) und SE-0461 (NonisolatedNonsendingByDefault). Mit diesen Einstellungen bleibt extractSticker auf dem Actor des Aufrufers, wodurch der Zugriff auf veränderlichen Zustand sicher wird. Ohne diese Einstellungen hat dieser Code einen Datenwettlauf – der Compiler wird ihn anzeigen.

nonisolated final class PhotoProcessor {
    private 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
    }

    // Teure Arbeit in den gleichzeitigen Thread-Pool auslagern
    @concurrent
    static func extractSubject(from data: Data) async -> Sticker { /* ... */ }
}

// Aufrufer müssen await verwenden
let processor = PhotoProcessor()
processedPhotos[item.id] = await processor.extractSticker(data: data, with: item.id)

Um @concurrent zu verwenden:

  1. Markieren Sie den enthaltenden Typ als nonisolated
  2. Fügen Sie @concurrent zur Funktion hinzu
  3. Fügen Sie async hinzu, falls nicht bereits asynchron
  4. Fügen Sie await an den Aufrufstellen hinzu

Wichtige Designentscheidungen

EntscheidungBegründung
Standardmäßig single-threadedDer natürlichste Code ist datenwettlaufsicher; Nebenläufigkeit ist optional
Async bleibt auf dem aufrufenden ActorBeseitigt implizite Auslagerungen, die Datenwettlauf-Fehler verursachten
Isolierte KonformitätenMainActor-Typen können Protokollen ohne unsichere Workarounds entsprechen
@concurrent explizite ZustimmungHintergrundausführung ist eine bewusste Leistungsentscheidung, kein Zufall
MainActor-Standard-InferenzReduziert Boilerplate @MainActor-Annotationen für App-Ziele
Optionale AdoptionNicht-brechender Migrationspfad – Funktionen schrittweise aktivieren

Migrationsschritte

  1. In Xcode aktivieren: Swift-Compiler > Nebenläufigkeit im Bereich Baueinstellungen
  2. In SPM aktivieren: SwiftSettings-API im Paketmanifest verwenden
  3. Migrationstools verwenden: Automatische Codeänderungen über swift.org/migration
  4. Mit MainActor-Standards beginnen: Inferenzmodus für App-Ziele aktivieren
  5. @concurrent wo nötig hinzufügen: Zuerst profilieren, dann heiße Pfade auslagern
  6. Gründlich testen: Datenwettlauf-Probleme werden zu Compile-Fehlern

Best Practices

  • Auf MainActor beginnen – zuerst single-threaded Code schreiben, später optimieren
  • @concurrent nur für CPU-intensive Arbeit verwenden – Bildverarbeitung, Kompression, komplexe Berechnungen
  • MainActor-Inferenzmodus aktivieren für App-Ziele, die meist single-threaded sind
  • Vor dem Auslagern profilieren – Instruments verwenden, um tatsächliche Engpässe zu finden
  • Globale mit MainActor schützen – globaler/statischer veränderlicher Zustand benötigt Actor-Isolation
  • Isolierte Konformitäten verwenden statt nonisolated-Workarounds oder @Sendable-Wrapper
  • Inkrementell migrieren – Funktionen einzeln in den Baueinstellungen aktivieren

Anti-Patterns vermeiden

  • @concurrent auf jede async-Funktion anwenden (die meisten benötigen keine Hintergrundausführung)
  • nonisolated verwenden, um Compiler-Fehler zu unterdrücken, ohne Isolation zu verstehen
  • Legacy DispatchQueue-Muster beibehalten, wenn Actors die gleiche Sicherheit bieten
  • model.availability-Prüfungen im Nebenläufigkeits-bezogenen Foundation Models Code überspringen
  • Gegen den Compiler kämpfen – wenn er einen Datenwettlauf meldet, hat der Code ein echtes Nebenläufigkeitsproblem
  • Annehmen, dass aller async-Code im Hintergrund läuft (Swift 6.2 Standard: bleibt auf dem aufrufenden Actor)

Wann verwenden

  • Alle neuen Swift 6.2+ Projekte (Zugängliche Nebenläufigkeit ist der empfohlene Standard)
  • Migration bestehender Apps von Swift 5.x oder 6.0/6.1 Nebenläufigkeit
  • Behebung von Compiler-Fehlern zur Datenwettlaufsicherheit bei der Adoption von Xcode 26
  • Entwicklung von MainActor-zentrierten App-Architekturen (die meisten UI-Apps)
  • Leistungsoptimierung – Auslagern bestimmter schwerer Berechnungen in den Hintergrund

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Verwandte Skills