Communitygithub.com

swift-concurrency-6-2

Concorrência Acessível do Swift 6.2 — single-threaded por padrão, @concurrent para descarregamento explícito em segundo plano, conformidades isoladas para tipos do MainActor. Use ao adotar a concorrência do Swift 6.2 — descarregando com @concurrent ou resolvendo isolamento do MainActor.

O que é swift-concurrency-6-2?

Esta skill oferece um guia abrangente para adotar o modelo de concorrência do Swift 6.2, que torna o código single-threaded por padrão e introduz concorrência de forma explícita com `@concurrent`, eliminando erros comuns de data race sem sacrificar desempenho. Ela abrange padrões essenciais como conformidades isoladas para tipos MainActor, proteção de variáveis globais/estáticas com `@MainActor`, e o modo de inferência padrão do MainActor que reduz a necessidade de anotações manuais. A skill explica como descarregar trabalho pesado para threads em segundo plano usando `@concurrent` e fornece um passo a passo de migração, além de práticas recomendadas e anti-padrões para evitar. É ideal para desenvolvedores que estão migrando projetos do Swift 5.x/6.0/6.1 para o Swift 6.2, resolvendo erros de data race ou projetando arquiteturas centradas no MainActor com as configurações de build da Xcode 26.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/swift-concurrency-6-2

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Concorrência Acessível do Swift 6.2

Padrões para adotar o modelo de concorrência do Swift 6.2, onde o código é executado em single-thread por padrão e a concorrência é introduzida explicitamente. Elimina erros comuns de data race sem sacrificar desempenho.

Quando Ativar

  • Migrando projetos Swift 5.x ou 6.0/6.1 para Swift 6.2
  • Resolvendo erros do compilador relacionados à segurança contra data races
  • Projetando arquitetura de aplicativos baseada em MainActor
  • Descarregando trabalho intensivo de CPU para threads em segundo plano
  • Implementando conformidades de protocolo em tipos isolados por MainActor
  • Habilitando as configurações de build "Approachable Concurrency" no Xcode 26

Problema Central: Descarregamento Implícito em Segundo Plano

No Swift 6.1 e anteriores, funções async podiam ser implicitamente descarregadas para threads em segundo plano, causando erros de data race mesmo em código aparentemente seguro:

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

        // Erro: Enviar 'self.photoProcessor' corre risco de causar data races
        return await photoProcessor.extractSticker(data: data, with: item.itemIdentifier)
    }
}

O Swift 6.2 corrige isso: funções async permanecem no actor chamador por padrão.

// Swift 6.2: OK — async permanece no MainActor, sem data race
@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)
    }
}

Padrão Central — Conformidades Isoladas

Tipos MainActor agora podem estar em conformidade com protocolos não isolados de forma segura:

protocol Exportable {
    func export()
}

// Swift 6.1: ERRO — cruza para código isolado pelo MainActor
// Swift 6.2: OK com conformidade isolada
extension StickerModel: @MainActor Exportable {
    func export() {
        photoProcessor.exportAsPNG()
    }
}

O compilador garante que a conformidade seja usada apenas no MainActor:

// OK — ImageExporter também é @MainActor
@MainActor
struct ImageExporter {
    var items: [any Exportable]

    mutating func add(_ item: StickerModel) {
        items.append(item)  // Seguro: mesmo isolamento de actor
    }
}

// ERRO — contexto não isolado não pode usar conformidade do MainActor
nonisolated struct ImageExporter {
    var items: [any Exportable]

    mutating func add(_ item: StickerModel) {
        items.append(item)  // Erro: conformidade isolada pelo MainActor não pode ser usada aqui
    }
}

Padrão Central — Variáveis Globais e Estáticas

Proteja o estado global/estático com MainActor:

// Swift 6.1: ERRO — tipo não Sendable pode ter estado mutável compartilhado
final class StickerLibrary {
    static let shared: StickerLibrary = .init()  // Erro
}

// Correção: Anotar com @MainActor
@MainActor
final class StickerLibrary {
    static let shared: StickerLibrary = .init()  // OK
}

Modo de Inferência Padrão do MainActor

O Swift 6.2 introduz um modo onde o MainActor é inferido por padrão — sem necessidade de anotações manuais:

// Com inferência padrão do MainActor ativada:
final class StickerLibrary {
    static let shared: StickerLibrary = .init()  // Implicitamente @MainActor
}

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

extension StickerModel: Exportable {  // Conformidade implicitamente @MainActor
    func export() {
        photoProcessor.exportAsPNG()
    }
}

Este modo é opcional e recomendado para aplicativos, scripts e outros targets executáveis.

Padrão Central — @concurrent para Trabalho em Segundo Plano

Quando você precisa de paralelismo real, descarregue explicitamente com @concurrent:

Importante: Este exemplo requer as configurações de build "Approachable Concurrency" — SE-0466 (isolamento padrão do MainActor) e SE-0461 (NonisolatedNonsendingByDefault). Com elas ativadas, extractSticker permanece no actor do chamador, tornando o acesso a estado mutável seguro. Sem essas configurações, este código tem um data race — o compilador sinalizará.

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
    }

    // Descarregar trabalho pesado para o pool de threads concorrentes
    @concurrent
    static func extractSubject(from data: Data) async -> Sticker { /* ... */ }
}

// Chamadores devem usar await
let processor = PhotoProcessor()
processedPhotos[item.id] = await processor.extractSticker(data: data, with: item.id)

Para usar @concurrent:

  1. Marque o tipo que o contém como nonisolated
  2. Adicione @concurrent à função
  3. Adicione async se ainda não for assíncrona
  4. Adicione await nos pontos de chamada

Principais Decisões de Design

DecisãoJustificativa
Single-threaded por padrãoO código mais natural é livre de data races; concorrência é opt-in
Async permanece no actor chamadorElimina o descarregamento implícito que causava erros de data race
Conformidades isoladasTipos MainActor podem estar em conformidade com protocolos sem soluções inseguras
@concurrent opt-in explícitoExecução em segundo plano é uma escolha deliberada de desempenho, não acidental
Inferência padrão do MainActorReduz anotações @MainActor verbosas para targets de aplicativos
Adoção opt-inCaminho de migração sem quebra — habilite recursos incrementalmente

Passos para Migração

  1. Habilitar no Xcode: Seção de Concorrência do Compilador Swift nas Configurações de Build
  2. Habilitar no SPM: Use a API SwiftSettings no manifesto do pacote
  3. Usar ferramentas de migração: Mudanças automáticas de código via swift.org/migration
  4. Comece com padrões do MainActor: Ative o modo de inferência para targets de aplicativos
  5. Adicione @concurrent onde necessário: Perfile primeiro, depois descarregue caminhos críticos
  6. Teste minuciosamente: Problemas de data race tornam-se erros de compilação

Práticas Recomendadas

  • Comece no MainActor — escreva código single-threaded primeiro, otimize depois
  • Use @concurrent apenas para trabalho intensivo de CPU — processamento de imagem, compressão, computação complexa
  • Ative o modo de inferência do MainActor para targets de aplicativos que são majoritariamente single-threaded
  • Perfile antes de descarregar — use Instruments para encontrar gargalos reais
  • Proteja globais com MainActor — estado mutável global/estático precisa de isolamento de actor
  • Use conformidades isoladas em vez de soluções nonisolated ou wrappers @Sendable
  • Migre incrementalmente — habilite recursos um de cada vez nas configurações de build

Anti-Padrões a Evitar

  • Aplicar @concurrent a toda função async (a maioria não precisa de execução em segundo plano)
  • Usar nonisolated para suprimir erros do compilador sem entender o isolamento
  • Manter padrões legados de DispatchQueue quando actors fornecem a mesma segurança
  • Pular verificações de model.availability em código de Foundation Models relacionado à concorrência
  • Brigar com o compilador — se ele reportar um data race, o código tem um problema real de concorrência
  • Assumir que todo código async roda em segundo plano (padrão do Swift 6.2: permanece no actor chamador)

Quando Usar

  • Todos os novos projetos Swift 6.2+ (Concorrência Acessível é o padrão recomendado)
  • Migrando aplicativos existentes de Swift 5.x ou 6.0/6.1
  • Resolvendo erros do compilador de segurança contra data races durante a adoção do Xcode 26
  • Construindo arquiteturas de aplicativos centradas no MainActor (a maioria dos aplicativos de UI)
  • Otimização de desempenho — descarregando computações pesadas específicas para segundo plano

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/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

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.

Habilidades Relacionadas