Swift 6 Minimum Requirement for App Store

Good afternoon, all!

I was wondering if there was a timeline for when the App Store and/or TestFlight will drop support for Swift 5?

I know Swift 6 was released last year and historically App Store requires a certain SDK minimum for upload. I was wondering if any SDK update was on the docket that would effectively force applications onto Swift 6?

Looking at past releases, I had estimated mid to late 2026, but I wanted to confirm?

Swift 4

  • Released September 2017
  • Became the default SDK in Xcode 9
  • Strongly "encouraged" via the iOS 12 SDK in late 2018
  • Essentially "required" by early 2019

Swift 5

  • Released March 2019
  • Became the default SDK in Xcode 10.2
  • Strongly "encouraged" via the iOS 12.1 SDK in early 2019
  • Essentially "required" by late 2020

Swift 6

  • Released June 2024
  • Became the default SDK in Xcode 16
  • Strongly "encouraged" via the iOS 18 SDK in April 2025
  • **Essentially "required" by mide-late 2026 ?? **

Thank you in advance!

That seems a reasonable guess.

So it's time to prepare: https://wwdcnotes.com/documentation/wwdcnotes/wwdc24-10169-migrate-your-app-to-swift-6/

While I can't predict the future or comment on anything future looking, I'd like to color in some details of the complier so you have a more complete understanding of how things work, in hopes that you can use this information to inform your own decisions around adopting Swift 6.

If you take a look at the Xcode support page and look at the table of Xcode versions, you'll notice the Swift column has two sets of data — the complier version, and language modes.

As you stated, Swift 6 was released with Xcode 16, and you can see that in the version number of the complier in the chart. Every Xcode release has one version of the Swift complier, and so that means every app that has compiled with Xcode 16 or newer has already compiled with the Swift 6 complier.

Your question here is better stated as what is the longevity of the Swift 5 language mode? The language mode (which you'll find in your project as the SWIFT_VERSION build setting) is the version of the language the compiler is using for its compilation rules — things like syntax changes as the language evolves, and of course the concurrency safety features that are the significant advancement added by Swift 6. You can see from the support page's chart that every version of the Swift 6 compiler as of Xcode 26 still supports the Swift 4 language mode — Swift 4, Swift 4.2, Swift 5, and Swift 6 to be complete. This means that libraries written with Swift 4 paradigms in mind continue to compile without requiring source code changes in Xcode 26, even with the Swift 6 compiler. Further, the purpose of language modes is to give libraries time to look at how they can move forward to use new Swift features over time.

While I know this doesn't answer your direct questions since I can't discuss the future, I hope you find pulling apart the distant levels here helpful.

— Ed Ford,  DTS Engineer

@Ed Ford, for this useful clarification.

So that means there is no urgency to switch to Swift 6 mode, unless of course there are concurrency issues or we need specific Swift 6 feature ?

I understand however that it is wise to set concurrency checking at the max level, even in Swift 5 mode. Is it correct ?

I can't speak to urgency, because that could be interpreted as a future looking timeframe.

As a process, I would enable the Swift 5 stricter concurrency checking in code that you control to gauge what the important issues in your code base are, and decide what it would mean to fix them in terms of complexity. After that, try out the Swift 6 language mode, and see what other issues the complier identifies, once again with an eye for complexity. You can then take that information about the technical complexity and use that as information in your overall scheduling and mangement of your software project, and when the best time to do the work is.

Since you can do that on a module-by-module basis, there's no need to jump to Swift 6 all at once. You can turn it on just for one module where perhaps there are no issues, or they are easy to address, after updating the language mode, and expand outward from there. And looking at this from the other direction, if there's a module where the issues are extensive in order to move forward, perhaps doing the work on that module is the higher priority because it will take longer to complete. Those are the kinds of choices you'll have to think though based on the exact specifics of your software project.

The above pertains to your code. The other aspect here is code you're not in control of, either from third-party libraries, or even other teams within your company. You certainly want all of your dependencies to be aware of Swift 6 (i.e. you're not depending on a library that is not actively maintained) and charting their own path to adopting Swift 6 in time. This could be as simple as updating to a newer version where the work is already done. But as I said above, the language modes are meant to provide time for the migration — library vendors may need more time to migrate than app-level code, as they have the needs of many clients of their API to consider.

Again, I realize I'm not answering your question directly, but I hope the above is a useful strategy to inform your thinking about the problem, and how you can incrementally move parts of your app forward over time as it makes sense for each module to do so.

— Ed Ford,  DTS Engineer

Swift 6 Minimum Requirement for App Store
 
 
Q