Swifty Journey

Guía completa de Swift 6.2: Approachable Concurrency explicado

Guía interactiva con las 5 feature flags de Approachable Concurrency en Xcode 26, configuración recomendada, y guía de migración paso a paso.

6.2

Overview

Approachable Concurrency

Approachable Concurrency es un build setting real en Xcode 26 que activa un conjunto de compiler flags para hacer la concurrencia más accesible. Nace del vision document del Swift team publicado en febrero 2025.

💡Es un setting real, no solo un concepto. Approachable Concurrency es completamente independiente de Default Actor Isolation. Son dos knobs separados en Xcode.

Las 5 feature flags

Lo que se activa al poner Approachable Concurrency = Yes

NonisolatedNonsendingByDefault
SE-0461 · Async nonisolated hereda el actor del caller
Nuevo en 6.2
InferIsolatedConformances
SE-0470 · Conformances aisladas por actor
Nuevo en 6.2
InferSendableFromCaptures
SE-0418 · Inferencia automática de @Sendable
Ya en Swift 6
GlobalActorIsolatedTypesUsability
SE-0434 · Mejor usabilidad de tipos @MainActor
Ya en Swift 6
DisableOutwardActorInference
SE-0401 · Property wrappers no propagan aislamiento
Ya en Swift 6
⚠️En Swift 6 language mode, solo 2 flags cambian: InferIsolatedConformances y NonisolatedNonsendingByDefault. Las otras 3 ya están habilitadas por defecto.

Cómo activarlo en un Swift Package

🚨No existe un flag único para SPM. .enableUpcomingFeature("ApproachableConcurrency") no existe como feature flag del compilador. SWIFT_APPROACHABLE_CONCURRENCY es un build setting exclusivo de Xcode que activa internamente los flags individuales. En SPM, .enableUpcomingFeature() recibe un String y no valida si el flag existe — lo ignora silenciosamente sin error de compilación. Debes activar los flags individuales.

Con swiftLanguageModes: [.v6]

Si tu Package ya usa Swift 6 language mode

En Swift 6 language mode, 3 de los 5 flags ya están activos por defecto (DisableOutwardActorInference, GlobalActorIsolatedTypesUsability, InferSendableFromCaptures). Solo necesitas agregar los 2 nuevos de Swift 6.2:

Package.swift — Swift 6 (solo 2 flags necesarios)
// swift-tools-version: 6.2
import PackageDescription

let package = Package(
    name: "SearchFeature",
    platforms: [.iOS(.v26), .macOS(.v26)],
    products: [
        .library(name: "SearchFeature", targets: ["SearchFeature"]),
    ],
    targets: [
        .target(
            name: "SearchFeature",
            swiftSettings: [
                // Solo los 2 flags nuevos de 6.2:
                .enableUpcomingFeature("NonisolatedNonsendingByDefault"),
                .enableUpcomingFeature("InferIsolatedConformances"),
            ]
        ),
    ],
    swiftLanguageModes: [.v6] // ← los otros 3 flags ya vienen incluidos
)

Sin swiftLanguageModes: [.v6] (todos los flags)

Si tu Package aún usa Swift 5 language mode

Si aún no has migrado a Swift 6 language mode, necesitas los 5 flags explícitamente:

Package.swift — Swift 5 (los 5 flags)
// swift-tools-version: 6.2

.target(
    name: "YourTarget",
    swiftSettings: [
        // Solo si quieres MainActor default (opcional):
        // .defaultIsolation(MainActor.self),

        // Los 5 Approachable Concurrency flags:
        .enableUpcomingFeature("NonisolatedNonsendingByDefault"),
        .enableUpcomingFeature("InferIsolatedConformances"),
        .enableUpcomingFeature("InferSendableFromCaptures"),
        .enableUpcomingFeature("GlobalActorIsolatedTypesUsability"),
        .enableUpcomingFeature("DisableOutwardActorInference")
    ]
)

Xcode vs SPM: la diferencia

Cómo Xcode resuelve estos valores internamente

Macro de XcodeSignificado
$(SWIFT_UPCOMING_FEATURE_6_0)Se activa con Swift 6 language mode
$(SWIFT_APPROACHABLE_CONCURRENCY)Se activa con el toggle Approachable Concurrency = Yes
$(SETTING_DefaultValue_...)Se activa si cualquiera de los dos está activo (OR lógico)
💡En Xcode, un solo toggle (Approachable Concurrency = Yes) activa los 5 flags. En SPM no existe ese toggle — debes usar los flags individuales con .enableUpcomingFeature(). Si ya usas swiftLanguageModes: [.v6], solo necesitas los 2 nuevos.
Fuentes verificadas: Apple Swift Evolution (SE-0461, SE-0466, SE-0470, SE-0434, SE-0401) · Hacking with Swift (Paul Hudson) · SwiftLee (Antoine van der Lee) · Donny Wals · Julio César Fernández · Apple Coding Academy · Swift Forums

Relacionados