Everything was working perfectly fine in your application for multiple years. Then one day a simple configuration change of a flag resulted in over 20,000 warnings for you to handle. Welcome to Swift 6, where your working code yesterday is a compiler error today. ## The change nobody asked to be default

WWDC 2024 introduced Swift 6, which was then reinforced and solidified in 2025 and 2026. The main highlight of Swift 6 was default data-race safety, achieved by strict concurrency checks during compilation (and strict concurrency checking is now on by default). The pitch is actually good. The compiler now mathematically proves your code has no data races before it even runs. This is important because data races were a serious issue. According to Apple's WWDC 2024 sessions, they caused almost 30% of crashes in production iOS apps. This means that an entire category of Heisenbugs disappears. Theoretically, this is a significant advantage. Sendable closures and actor isolation don't play nice with code written before they existed.

Writing for Level Up Coding in December 2025, iOS developer Alok Upadhyay flipped the Strict Concurrency Checking flag on his team's largest legacy module and got 20,000 warnings, describing his screen as "a sea of red and orange warnings." Another common issue is referred to as "whack-a-mole". For example, on the Swift.org forums in April 2025, a developer mentioned that they added @MainActor to all classes to fix the errors and 50 more appeared. That loop ate half a week before the thing finally built. Three and a half days were spent verifying that code which had already been sent for production was correct. Also, you don't have control over everything. For instance, a developer porting Ditto Edge Studio in June 2026 observed that a single dependency "can hold your entire module hostage" if it's not ready for Swift 6 (even if your code is perfect). This was not an unusual edge case in the early days. In the June 2024 beta, roughly 42% of packages were reported as ready (1,500 of 3,400), but that number included a lot of packages that weren't using any concurrency code. ## But the payoff is real, and that's the annoying part