"Start single-threaded. Escape on purpose, and say so in the type."
What Changed in Swift 6.2
Swift 6.2, released in September 2025, answered the most common complaint about Swift 6: that a small app with no real parallelism still drowned in isolation errors. It added three connected pieces, collectively called approachable concurrency.
- Default actor isolation. A module can declare that every declaration without an explicit isolation is
@MainActor. In SwiftPM that is.defaultIsolation(MainActor.self); on the compiler command line-default-isolation MainActor. The exemptions are sensible: actors, explicitly isolated declarations, and declarations that inherit isolation from a superclass or protocol keep what they have. nonisolated(nonsending). Before 6.2, anonisolated asyncfunction always hopped to the global concurrent executor. With theNonisolatedNonsendingByDefaultupcoming feature, it instead runs in the caller's isolation — call it from the main actor and it stays on the main actor.@concurrent. The explicit way out: a function marked@concurrentruns on the concurrent executor, off whatever actor called it. Heavy decoding, image processing and scans get this annotation, visibly.
Xcode 26 turns these on for new app projects: SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor and SWIFT_APPROACHABLE_CONCURRENCY = YES. Existing projects keep their old settings until you change them.
These Are Meaning Changes, Not Warnings Switches
Flipping default isolation on an existing module changes what its code means: a helper that used to be nonisolated is now main-actor isolated, and a background caller must now await it. Turning on nonisolated(nonsending) changes where async code runs: an async function you relied on to leave the main actor now stays on it, and a long synchronous stretch inside it blocks the UI unless it becomes @concurrent. Neither change announces itself at the call site. Treat them as migrations, per target, with the same care as the language mode.
How the Family Reads It
The family's packages were written before these defaults existed, so they spell isolation out: @MainActor on UI types, actors for shared state, nonisolated and @Sendable where framework callbacks arrive. That style stays correct under 6.2. For a new, UI-heavy app target — Spark's Mac and iPhone apps, say — main-actor default isolation matches reality: nearly everything touches the UI. For a shared core library used by apps, extensions and a watch app, keep the nonisolated default and explicit annotations, because that code runs in many contexts and should not silently belong to one thread.