Swifty Journey

Complete Swift 6.2 Guide: Approachable Concurrency Explained

Interactive guide covering the 5 feature flags of Approachable Concurrency in Xcode 26, recommended configuration, and step-by-step migration guide.

6.2

Overview

Approachable Concurrency

Approachable Concurrency is a real build setting in Xcode 26 that enables a set of compiler flags to make concurrency more accessible. It comes from the vision document published by the Swift team in February 2025.

💡It's a real setting, not just a concept. Approachable Concurrency is completely independent from Default Actor Isolation. They are two separate knobs in Xcode.

The 5 feature flags

What gets enabled when setting Approachable Concurrency = Yes

NonisolatedNonsendingByDefault
SE-0461 · Async nonisolated inherits the caller's actor
New in 6.2
InferIsolatedConformances
SE-0470 · Actor-isolated conformances
New in 6.2
InferSendableFromCaptures
SE-0418 · Automatic @Sendable inference
Already in Swift 6
GlobalActorIsolatedTypesUsability
SE-0434 · Better usability for @MainActor types
Already in Swift 6
DisableOutwardActorInference
SE-0401 · Property wrappers don't propagate isolation
Already in Swift 6
⚠️In Swift 6 language mode, only 2 flags change: InferIsolatedConformances and NonisolatedNonsendingByDefault. The other 3 are already enabled by default.

How to enable it in a Swift Package

🚨There is no single SPM flag. .enableUpcomingFeature("ApproachableConcurrency") does not exist as a compiler feature flag. SWIFT_APPROACHABLE_CONCURRENCY is an Xcode-only build setting that internally enables the individual flags. In SPM, .enableUpcomingFeature() takes a String and does not validate whether the flag exists — it silently ignores it with no compilation error. You must enable the individual flags.

With swiftLanguageModes: [.v6]

If your Package already uses Swift 6 language mode

In Swift 6 language mode, 3 of the 5 flags are already active by default (DisableOutwardActorInference, GlobalActorIsolatedTypesUsability, InferSendableFromCaptures). You only need to add the 2 new flags from Swift 6.2:

Package.swift — Swift 6 (only 2 flags needed)
// 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: [
                // Only the 2 new flags from 6.2:
                .enableUpcomingFeature("NonisolatedNonsendingByDefault"),
                .enableUpcomingFeature("InferIsolatedConformances"),
            ]
        ),
    ],
    swiftLanguageModes: [.v6] // ← the other 3 flags are already included
)

Without swiftLanguageModes: [.v6] (all flags)

If your Package still uses Swift 5 language mode

If you haven't migrated to Swift 6 language mode yet, you need all 5 flags explicitly:

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

.target(
    name: "YourTarget",
    swiftSettings: [
        // Only if you want MainActor default (optional):
        // .defaultIsolation(MainActor.self),

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

Xcode vs SPM: the difference

How Xcode resolves these values internally

Xcode MacroMeaning
$(SWIFT_UPCOMING_FEATURE_6_0)Activated by Swift 6 language mode
$(SWIFT_APPROACHABLE_CONCURRENCY)Activated by the Approachable Concurrency = Yes toggle
$(SETTING_DefaultValue_...)Activated if either of the two is active (logical OR)
💡In Xcode, a single toggle (Approachable Concurrency = Yes) enables all 5 flags. In SPM there is no such toggle — you must use individual flags with .enableUpcomingFeature(). If you already use swiftLanguageModes: [.v6], you only need the 2 new ones.
Verified sources: 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

Related