The Swift language mode, strict concurrency checking, and default actor isolation are separate configurations. Changing one does not automatically change the others.

01

Configuration landscape

SettingControls
SWIFT_VERSIONSwift language mode and associated concurrency rules.
SWIFT_STRICT_CONCURRENCYConcurrency diagnostics in Swift 5 language mode.
SWIFT_DEFAULT_ACTOR_ISOLATIONDefault isolation for otherwise unannotated declarations.
SWIFT_APPROACHABLE_CONCURRENCYA group of Swift 6.2 migration features.
SWIFT_UPCOMING_FEATURE_*Individual upcoming language features.
02

Swift language mode

Xcode: Swift Language Version · Build setting: SWIFT_VERSION

ValueBehavior
5Swift 5 compatibility, including when using a Swift 6 compiler.
6Swift 6 rules, including strict data-race safety checking.

Swift 5 mode still supports actors, async/await, task groups, and Sendable. Violations that warn in Swift 5 can become errors in Swift 6.

Build setting
SWIFT_VERSION = 5
SWIFT_STRICT_CONCURRENCY = complete
03

Strict concurrency checking

Xcode: Strict Concurrency Checking · Build setting: SWIFT_STRICT_CONCURRENCY

ValueMeaning
minimalLimited checking around explicit concurrency annotations.
targetedAdditional checking in code adopting concurrency features.
completeFull checking, including code not explicitly using concurrency.

Complete checking is primarily a Swift 5 migration setting. Swift 6 language mode enforces complete checking regardless of this value.

Migration starting point
SWIFT_VERSION = 5
SWIFT_STRICT_CONCURRENCY = complete
04

Default actor isolation

Available in Swift 6.2+. Build setting: SWIFT_DEFAULT_ACTOR_ISOLATION

ValueMeaning
nonisolatedDeclarations are nonisolated unless explicitly isolated or inferred.
MainActorUnannotated declarations default to main-actor isolation.
Implicit MainActor isolation
class ProfileViewModel {
    var name = ""

    func updateName(_ value: String) {
        name = value
    }
}
Explicit opt-out
nonisolated struct UserDTO: Codable, Sendable {
    let id: UUID
    let name: String
}

MainActor suits a primarily SwiftUI app target. nonisolated is often a better default for reusable non-UI packages. Default main-actor isolation does not make every operation run on the main actor.

05

Approachable Concurrency

Available in Swift 6.2+. This bundle groups features that make migration more incremental.

Build setting
SWIFT_APPROACHABLE_CONCURRENCY = YES
FeaturePurpose
DisableOutwardActorInferenceLimits implicit propagation of global-actor isolation.
GlobalActorIsolatedTypesUsabilityImproves use of global-actor-isolated types in safe contexts.
InferIsolatedConformancesInfers actor-isolated protocol conformances where appropriate.
InferSendableFromCapturesImproves Sendable inference from captures.
NonisolatedNonsendingByDefaultChanges how nonisolated async functions inherit caller context.
06

Execution context matters

With NonisolatedNonsendingByDefault, marking an async function nonisolated does not necessarily move expensive work off the caller's actor.

Caller context and generic executor
nonisolated func process() async {
    // Can remain in the caller's isolation context.
}

@concurrent
nonisolated func heavyWork() async {
    // Executes on the generic executor.
}

@concurrent does not create a new thread per call or make unsafe shared state safe.

07

Individual upcoming features

Use Xcode's Other Swift Flags to enable one feature without enabling the whole bundle:

Other Swift Flags
-enable-upcoming-feature NonisolatedNonsendingByDefault -enable-upcoming-feature InferIsolatedConformances
08

Swift Package Manager

Xcode target settings do not automatically configure independently built package targets. Configure package targets explicitly when consistent semantics are required.

Package.swift
swiftSettings: [
    .swiftLanguageMode(.v6),
    .defaultIsolation(MainActor.self),
    .enableUpcomingFeature("NonisolatedNonsendingByDefault"),
    .enableUpcomingFeature("InferIsolatedConformances")
]

For non-UI packages, omit .defaultIsolation(MainActor.self) or explicitly choose the nonisolated default. The swift-tools-version is the minimum tools version, not the language mode.

09

Recommended configurations

New SwiftUI application

Build setting
SWIFT_VERSION = 6
SWIFT_STRICT_CONCURRENCY = complete
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor
SWIFT_APPROACHABLE_CONCURRENCY = YES

Use explicit isolation choices for CPU-intensive and reusable code.

Existing app migrating to Swift 6

Build setting
SWIFT_VERSION = 5
SWIFT_STRICT_CONCURRENCY = complete
SWIFT_DEFAULT_ACTOR_ISOLATION = nonisolated
SWIFT_APPROACHABLE_CONCURRENCY = NO

Resolve warnings progressively, then evaluate default isolation and approachable concurrency independently before switching language modes.

Reusable non-UI framework

Build setting
SWIFT_VERSION = 6
SWIFT_STRICT_CONCURRENCY = complete
SWIFT_DEFAULT_ACTOR_ISOLATION = nonisolated
SWIFT_APPROACHABLE_CONCURRENCY = YES
10

What each setting does not do

Setting or featureCommon misconception
Swift 6 language modeDoes not make every declaration main-actor isolated.
Strict Concurrency = CompleteDoes not change Swift 5 mode into Swift 6 mode.
Default Actor Isolation = MainActorDoes not send expensive synchronous work to the background.
nonisolatedDoes not universally mean background execution.
asyncDoes not inherently mean parallel execution or a background thread.
SendableDoes not schedule work or create actor isolation.
11

Version compatibility

CapabilitySwift 5.9–5.10Swift 6.0–6.1Swift 6.2+
Swift 5 language modeYesYesYes
Swift 6 language modeNoYesYes
Complete strict checkingOpt-inAutomatic in Swift 6 modeAutomatic in Swift 6 mode
Default main-actor isolationNoNoYes
Approachable Concurrency bundleNoNoYes
@concurrent functionsNoNoYes