Swift compiler version and language mode version - Xcode 26

Hi,

I was trying to migrate some packages to swift 6 yesterday.

I ran into a funny detail

We have a project at work with some local SPM packages in Xcode 26 / iOS 18+

I updated my Package.swift to look like

// swift-tools-version: 6.2 import PackageDescription let package = Package( name: "Logging", platforms: [.iOS(.v18), .watchOS(.v11)], products: [ .library(name: "Logging", targets: ["Logging"]), ], targets: [ .target(name: "Logging"), ] ) 

And it compiled all right.

When I did the same for other packages (with no dependencies), I got some errors requiring to conform to Sendable and so on.

Then I assumed that I was using the Swift 6 language mode, specially since originally, my Package.swift looked like

// swift-tools-version: 6.2 import PackageDescription let package = Package( name: "Logging", platforms: [.iOS(.v18), .watchOS(.v11)], products: [ .library(name: "Logging", targets: ["Logging"]), ], targets: [ .target( name: "Logging", swiftSettings: [ .enableExperimentalFeature("StrictConcurrency=off") ] ), ], swiftLanguageModes: [.v5] ) 

Then, when running the app on Xcode cloud (on Xcode 26), I see the error

Static property 'logDestinations' is not concurrency-safe because it is nonisolated global shared mutable state

from a file part of the Logging package.

Finally I modified my Package.swift again to be like

// swift-tools-version: 6.2 import PackageDescription let package = Package( name: "Logging", platforms: [.iOS(.v18), .watchOS(.v11)], products: [ .library(name: "Logging", targets: ["Logging"]), ], targets: [ .target(name: "Logging"), ], swiftLanguageModes: [.v6] ) 

Now compiling the package scheme in Xcode actually showed me those errors I saw on CI.

But why? I assumed that not specifying the swiftLanguageModes was enough to be fully opt-in in swift 6. Or at least I expected that using swift-tools-version: 6.2

Also why Xcode cloud gave me the error when locally Xcode didn’t?

Finally, I am not sure where I could see the default value of swiftLanguageModes, as in if I don’t pass that value explicitly, what will the compiler use?

A lot of questions, but thanks!

1 Like

I believe I saw a GitHub issue fly buy that we were still using v5 as the default in SwiftPM. I think it’s fine to use v6 on new project but it needs to be a conscious decision to migrate from 5 to 6. So we need to be careful when making changes there.

1 Like