Swiftの最新安定版は、2026年9月15日にswift.orgで公開された6.4です。以下、対応するXcode、手元の環境がどの版かを調べる方法、更新の手順、6.2から6.4までの変更点を、swift.orgとAppleの一次情報および手元のSwift 6.3.3での実行結果でまとめています。
まとめ:Swiftの最新バージョンと確認・更新の要点
- 最新安定版はSwift 6.4(swift.orgでの公開日は2026年9月15日)。
- Appleプラットフォーム開発ではXcode 27に同梱されるコンパイラがSwift 6.4。Xcode 27はmacOS Tahoe 26.6以降を要求する。
- ひとつ前の世代はXcode 26.6 / 26.5 / 26.4.1がSwift 6.3、Xcode 26.3 / 26.2がSwift 6.2.3、Xcode 26 / 26.0.1がSwift 6.2。
- 手元の版は
swift --versionで分かる。表示されるのはコンパイラの版であって、言語モードとは別の軸。 - 更新方法はふたつ。Appleプラットフォーム向けならXcodeを更新する。LinuxやmacOSで複数の版を切り替えたいなら公式のツールチェーン管理コマンドSwiftly(最新は1.1.4)を使う。
- 6.4の目玉は、SwiftPMの既定ビルド基盤がSwift Buildへ切り替わったこと、
deferでawaitを書けるようになったこと、警告の扱いをソース上で制御する@diagnoseが入ったこと。
Swift 6.4の新機能と変更点
swift.orgブログ「Swift 6.4 Released」(2026年9月15日付・2026年9月19日確認)がハイライトに挙げるのは、SwiftPMの既定ビルド、Subprocess 1.0、相互運用の拡張、WebAssembly、組み込み、メモリ安全を保ったままの性能改善です。ここでは言語側の追加から順に見ていきます。
defer内のawaitとキャンセル遮蔽
SE-0493でdeferブロックの中に非同期呼び出しを書けるようになりました。defer本体のアイソレーションは常に外側スコープと同じです。あわせてSE-0504のwithTaskCancellationShieldが入り、キャンセル後でも最後まで走らせたい後始末を、キャンセル観測から遮蔽したスコープで実行できます。後始末がネットワーク呼び出しを含む場合、従来はキャンセル済みタスクの中で早期リターンして中断する余地がありました。
func processFile(at url: URL) async throws {
let handle = try FileHandle(forReadingFrom: url)
defer {
await withTaskCancellationShield {
await flushMetrics(for: url)
try? handle.close()
}
}
try await processContents(of: handle)
}
これはリリース記事に載っている例の抜粋です。flushMetrics(for:)とprocessContents(of:)は例示用の名前なので、手元で動かすときは別途実装が要ります。
警告の扱いをソースコード側で決める@diagnose
SE-0522の@diagnose(GroupID, as: error|warning|ignored)は、指定した警告グループの扱いをその宣言のレキシカルスコープ内だけ上書きします。ビルド設定のフラグで一律に潰す運用と違い、抑制の範囲と理由をreason:の文字列としてコードに残せます。
@diagnose(DeprecatedDeclaration, as: warning, reason: "Must maintain compatibility until end of release cycle")
func bridgeToLegacySystem() {
oldAPI() // warning: 'oldAPI()' is deprecated [#DeprecatedDeclaration]
}
もうひとつ、SE-0518で~Sendableという記法が入りました。型にSendableの自動推論を効かせたくないときに、継承関係へ影響を出さずに非Sendableであることを明示できます。
SwiftPMの既定ビルド基盤とSBOM生成
Swift Package Managerの既定のビルド基盤がSwift Buildになりました。リリースノートの表現は「Swift Build is now the default in Swift Package Manager」で、Linux・macOS・Windowsが同じ経路のビルドになります。同時にSE-0509のSBOM生成が入り、SPDXとCycloneDXのどちらでも出力できます。設定を変えていないのにビルドログの様子が変わったら、まずこの切り替えを疑ってください。マニフェストの書き方はSwift Package Manager入門で扱っています。
コピーを避ける型と、安全になった生メモリ操作
6.4は、値をコピーせずに扱う経路を増やしました。SE-0507のborrow/mutateアクセサでプロパティ越しに値を借用・変更でき、SE-0527の動的配列はノンコピー要素をコピーオンライトの確保なしに格納します。SE-0516のIterableプロトコルは各要素を借用しながらループでき、生メモリ側ではSE-0525がunsafe注釈なしで使えるロード・ストアAPIを追加しました。
プラットフォーム面では、WebAssembly向けJavaScriptKitのブリッジが従来の動的ブリッジ比で最大40倍速くなりました。Android向けSDKはLTS版のNDK 30でビルドされ、SwiftPMがAndroidに対応したためインストール後スクリプトが不要になりました。
Swiftのバージョン履歴|6.0から6.4までのリリース日
日付はすべてswift.orgのインストールページにあるリリース一覧の値です(2026年9月19日確認)。GitHubのタグに付く公開日時とは1日から3日ずれることがあるため、ここではswift.org側に統一しています。
| バージョン | リリース日 | この版の主眼 |
|---|---|---|
| 6.4 | 2026年9月15日 | SwiftPMの既定がSwift Build、async defer、@diagnose |
| 6.3.3 | 2026年6月29日 | 6.3系の修正リリース |
| 6.3.2 | 2026年5月11日 | 6.3系の修正リリース |
| 6.3.1 | 2026年4月16日 | 6.3系の修正リリース |
| 6.3 | 2026年3月24日 | モジュールセレクタ、@c属性、Android向けSDKの初回公式リリース |
| 6.2.4 | 2026年2月26日 | 6.2系の修正リリース |
| 6.2.3 | 2025年12月12日 | 6.2系の修正リリース |
| 6.2.2 | 2025年12月8日 | 6.2系の修正リリース |
| 6.2.1 | 2025年11月3日 | 6.2系の修正リリース |
| 6.2 | 2025年9月15日 | デフォルトMainActor、@concurrent、InlineArray、Span |
| 6.1 | 2025年3月31日 | 6.0系からの改良リリース |
| 6.0 | 2024年9月16日 | データ競合安全を言語モードとして導入 |
6.3で実務に効くのはSE-0491のモジュールセレクタです。2つのモジュールが同じ名前の型を提供しているとき、SwiftUI::Viewのように二重コロンでどちらの宣言かを指定できます。あわせてTaskやRegexをSwift.Taskと修飾できるようになりました(従来の_Concurrencyと_StringProcessingも互換のため残っています)。SE-0489はCodableの失敗メッセージを整理したもので、長大なcodingPathのダンプがPath: [0].address.city.birds[1].nameのような表記になります。
XcodeとSwiftのバージョン対応表
Appleの「Xcode システム条件」に載っている対応表から、Xcode 16以降を抜き出したものです(2026年9月19日確認。旧URLのdeveloper.apple.com/jp/support/xcode/ は301でこのページへ移動します)。対応macOSの表記はApple側の記載をそのまま写しています。
| Xcode | 同梱コンパイラ | 対応macOS |
|---|---|---|
| Xcode 27.2 beta | Swift 6.4 | macOS Tahoe 26.6以降 |
| Xcode 27.1 beta | Swift 6.4 | macOS Tahoe 26.6以降 |
| Xcode 27 | Swift 6.4 | macOS Tahoe 26.6以降 |
| Xcode 26.6 | Swift 6.3 | macOS Tahoe 26.2から26.x |
| Xcode 26.5 | Swift 6.3 | macOS Tahoe 26.2から26.x |
| Xcode 26.4.1 | Swift 6.3 | macOS Tahoe 26.2から26.x |
| Xcode 26.3 | Swift 6.2.3 | macOS Sequoia 15.6からmacOS Tahoe 26.x |
| Xcode 26.2 | Swift 6.2.3 | macOS Sequoia 15.6からmacOS Tahoe 26.x |
| Xcode 26.1.1 | Swift 6.2.1 | macOS Sequoia 15.6からmacOS Tahoe 26.x |
| Xcode 26.1 | Swift 6.2.1 | macOS Sequoia 15.6からmacOS Tahoe 26.x |
| Xcode 26.0.1 | Swift 6.2 | macOS Sequoia 15.6からmacOS Tahoe 26.x |
| Xcode 26 | Swift 6.2 | macOS Sequoia 15.6以降 |
| Xcode 16.4 | Swift 6.1 | macOS Sequoia 15.3からmacOS Tahoe 26.1.x |
| Xcode 16.3 | Swift 6.1 | macOS Sequoia 15.2から15.x |
| Xcode 16.2 | Swift 6.0 | macOS Sonoma 14.5からmacOS Sequoia 15.x |
| Xcode 16.1 | Swift 6.0 | macOS Sonoma 14.5からmacOS Sequoia 15.x |
| Xcode 16 | Swift 6.0 | macOS Sonoma 14.5からmacOS Sequoia 15.x |
Xcode側のリリース日や各版の変更点はXcodeのバージョン確認とアップデート手順をまとめた記事で扱っています。macOS Sequoiaのまま使い続けたい場合の上限についてはXcode 26.3のダウンロード方法を参照してください。
コンパイラ版と言語モードの切り分け
対応表のSwift欄は、Appleの原文では「コンパイラ: Swift 6.4」「言語モード: Swift 6 / Swift 5 / Swift 4.2 / Swift 4」と2段に分かれています。ここを混同すると、バージョンを上げたのに新しい診断が出ないという食い違いが起きます。
実際に確かめました。手元はCommand Line Tools同梱のApple Swift 6.3.3です。次のコードをオプションなしでビルドすると、条件分岐は偽の側に落ちます。
#if swift(>=6)
print("language mode: 6 or later")
#else
print("language mode: 5 or earlier")
#endif
オプションなしの実行結果は「language mode: 5 or earlier」で、-swift-version 5を明示したときも同じでした。-swift-version 6を付けたときだけ「language mode: 6 or later」になります。これはswiftcを直接呼んだ場合の既定です。SwiftPMのパッケージではswift-tools-versionとマニフェストのswiftLanguageModesが既定を決め、Xcodeのターゲットでは Swift Language Version のビルド設定が決めます。いずれにせよ、データ競合安全のエラーを受けたいならツールチェーンを上げるだけでは足りず、言語モードを6に切り替える指定が別に要ります。
Swiftのバージョン確認方法
swift --versionによるコンパイラ版の確認
ターミナルでswift --versionを実行すると、コンパイラの版とターゲットが出ます。2026年9月19日にmacOS上のCommand Line Toolsで実行した結果は次のとおりです。
$ swift --version
swift-driver version: 1.148.6 Apple Swift version 6.3.3 (swiftlang-6.3.3.1.3 clang-2100.1.1.101)
Target: x86_64-apple-macosx26.0
読むべき箇所は3つです。Apple Swift version 6.3.3がコンパイラのバージョン、swiftlang-6.3.3.1.3がツールチェーンのビルド識別子、Targetが既定のターゲットトリプルです。xcrun swift -versionでも同じ出力が得られますが、xcrunはxcode-selectで選ばれている開発者ディレクトリを経由するため、Xcodeを複数入れている環境では「いま選ばれているXcodeの版」を反映します。
ターゲットや対応するSDKまで機械可読で欲しいときはswiftc -print-target-infoを使います。JSONでcompilerVersionやswiftCompilerTag、target.tripleが返るので、CIでの版チェックに向いています。
swift-tools-versionが宣言する範囲
パッケージの先頭行にある// swift-tools-version: 6.2は、インストールされているSwiftの版ではありません。これはマニフェストの解釈に使うSwiftPMの最低バージョンと、マニフェストAPIのどの世代の文法で書かれているかの宣言です。6.2と書いたパッケージはSwift 6.4のツールチェーンでも問題なくビルドできますが、6.4で追加されたマニフェストAPIは使えません。逆に、宣言した版より古いツールチェーンで開こうとするとエラーになります。「手元のSwiftは6.4なのにパッケージが古い機能しか使えない」と感じたら、この行を疑ってください。
Swiftを最新版へ更新する手順
Appleプラットフォーム向けSwiftのXcode経由での更新
iOSやmacOS向けのアプリなら、Swiftだけを入れ替えるのではなくXcodeを更新します。同梱コンパイラがその版に切り替わります。注意点はmacOS側の要件で、Xcode 27はmacOS Tahoe 26.6以降を要求するため、Sequoiaのままの端末ではOS更新が先に必要です。複数のXcodeを併存させているなら、更新後にsudo xcode-select --switchで使う側を明示しておくと、コマンドライン側の版だけ古いまま残る事故を防げます。
Swiftlyによるツールチェーンの導入と切り替え
LinuxやサーバーサイドSwift、macOSで複数の版を行き来したい場合は、swift.orgが配布するツールチェーン管理コマンドSwiftly(最新は2026年9月15日公開の1.1.4)を使います。macOSでのインストール手順はswift.orgのインストールページに載っています。
curl -O https://download.swift.org/swiftly/darwin/swiftly.pkg && \
installer -pkg swiftly.pkg -target CurrentUserHomeDirectory && \
~/.swiftly/bin/swiftly init --quiet-shell-followup && \
. "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/env.sh" && \
hash -r
導入後はswiftly install 6.4で6.4系を入れ、swiftly use 6.4で切り替えます。切り替わったかはswift --versionで確かめてください。swiftly useが見るのはカレントディレクトリの.swift-versionで、選択はプロジェクト単位です。シェル全体の既定を変えたいときは--global-defaultを付けます。開発スナップショットにも対応していて、swiftly install main-snapshotで次期メジャーの先行版を、swiftly install 6.4.x-snapshotで6.4系の最新スナップショットを入れられます。Swift 6.4からはVS Code用のSwift拡張機能がSwiftly連携を持ち、Open VSX Registryでも配布されるようになったため、VS CodeだけでなくCursorなどのエディタでもツールチェーンを選んで使えます。
Swift 6.2で入った並行処理の変更
日々の書き方を大きく変えたのは2025年9月の6.2で、Approachable Concurrencyと総称される一連の変更が入りました。以下の版帰属は、swift-evolutionの機械可読データ(download.swift.orgで配布されているevolution.json)のstatusフィールドで確認しています(2026年9月19日取得)。
デフォルトMainActorのビルド設定と適用範囲
SE-0466「Control default actor isolation inference」が6.2でimplementedになっています。これはコード中の属性ではなく、コンパイラに渡す設定です。-default-isolation MainActorを付けると、明示的な注釈のない宣言が既定でMainActor隔離とみなされます。効き方は、同じコードをフラグの有無でビルドすると分かります。
func helper() { print("helper") }
nonisolated func run() { helper() }
run()
手元の6.3.3で-swift-version 6だけを付けたときは通り、「helper」を出力しました。-default-isolation MainActorを足すと、同じコードが次のエラーで落ちます。注釈のないhelper()がMainActor隔離とみなされ、nonisolatedな同期関数から呼べなくなるためです。
error: call to main actor-isolated global function 'helper()' in a synchronous nonisolated context [#ActorIsolatedCall]
Xcodeではプロジェクト設定のDefault Actor Isolationがこれにあたります。UIコードが大半を占めるアプリなら、@MainActorを全体に書いて回る手間が消えるぶん素直に効きます。一方、バックグラウンド処理を多く持つライブラリで一括して有効にすると、本来並行に走らせたかった処理までメインスレッドへ寄り、UIの応答が落ちる。ターゲット単位で切り替えられる設定なので、UI層のターゲットだけ有効にするのが現実的な落としどころです。
@concurrentによる呼び出し元アクターからの切り離し
SE-0461(6.2でimplemented)は、nonisolatedなasync関数を呼び出し元のアクター上で走らせる変更です。ここで取り違えやすいのは有効化の条件で、Swift 6の言語モードにしただけでは既定になりません。アップカミング機能NonisolatedNonsendingByDefaultを有効にするか、関数ごとにnonisolated(nonsending)と書いた場合に適用されます。
手元の6.3.3で確かめました。nonisolatedなasync関数の中でMainActor.assertIsolated()を呼び、MainActorからawaitする次のコードです。
nonisolated func probe() async {
MainActor.assertIsolated("probe is NOT on the main actor")
print("probe ran on the main actor")
}
@MainActor func caller() async { await probe() }
await caller()
-swift-version 6だけで実行するとアサーションで落ち、バックトレースに_pthread_wqthreadが並びます。つまり呼び出し元のアクターを離れています。-enable-upcoming-feature NonisolatedNonsendingByDefaultを足すと「probe ran on the main actor」を出力しました。
この機能を有効にすると、今度は重い処理が呼び出し元のアクターに居座ります。MainActor上で回す同期計算がそれにあたり、UIの応答が落ちる。別スレッドへ逃がしたい関数には@concurrentを付けてください。同じフラグを有効にしたままprobe()に@concurrentを付け直すと、アサーションは再び失敗しました(終了コード132)。@concurrentはアクターへの張り付きを明示的に解く側の指定です。
@concurrent
func heavy() async -> Int { (1...1000).reduce(0, +) }
print(await heavy())
この例自体は-swift-version 6のみで動き、500500を出力します。
同じ6.2で入ったSE-0472のTask.immediateは逆向きの道具で、隔離が両立するなら呼び出し文脈でそのままタスクを開始し、スケジューリングのオーバーヘッドを避けます。こちらも6.3.3でTask.immediate { 42 }が42を返すことを確認しています。
InlineArrayの固定長格納とSpanの境界検査付き参照
SE-0453のInlineArrayは要素数を型に持つ固定長配列で、要素の格納領域のために別途ヒープを確保しません(その値自体がクラスのプロパティなら、クラスの割り当ての中に収まります)。SE-0447のSpanは連続メモリへの安全な参照で、従来UnsafeBufferPointerで扱っていた領域を境界検査付きで読めます。どちらも6.2でimplementedです。6.3.3で次を実行すると「3 1 20 3」「3 10 30」が出ました。
var a: InlineArray<3, Int> = [1, 2, 3]
a[1] = 20
print(a.count, a[0], a[1], a[2])
let arr = [10, 20, 30]
let s: Span<Int> = arr.span
print(s.count, s[0], s[2])
SE-0458の厳格メモリ安全チェックも6.2です。これもビルド設定で、-strict-memory-safetyを付けるとunsafe注釈のないポインタ操作に「warning: expression uses unsafe constructs but is not marked with ‘unsafe’ [#StrictMemorySafety]」が出ます。既定ではエラーではなく警告なので、既存コードに入れてもそれだけでビルドは止まりません(警告をエラーへ昇格させる設定を入れている場合は止まります)。なお6.4ではSpanとMutableSpanの生バイトアクセサ(bytesとmutableBytes)が@unsafe扱いへ変わりました。パディングを含む型で未初期化バイトが残りうるためで、SE-0458・SE-0467・SE-0485の実装漏れの訂正という位置づけです。
ツールチェーンを上げる前に確かめる非互換
チームの一部だけがXcode 27へ上げた状況では、6.4の記法が古いツールチェーンで落ちます。何が返るかを、6.4の構文を6.3.3のツールチェーン(Xcode 26.6相当)で実際にコンパイルして確かめました。
| 6.4で書ける記法 | Swift 6.3.3での実測結果 |
|---|---|
| defer { await r.cleanup() } | error: call to actor-isolated instance method ‘cleanup()’ in a synchronous nonisolated context |
| public class Base: ~Sendable {} | error: ‘~Sendable’ requires -enable-experimental-feature TildeSendable |
| @diagnose(…) | error: unknown attribute ‘diagnose’ |
| withTaskCancellationShield { } | error: cannot find ‘withTaskCancellationShield’ in scope |
いずれも警告ではなくエラーで、ビルドが止まります。特に~Sendableの行は「実験的機能のフラグを付けろ」という文面なので、フラグを足せば回避できると読めてしまいます。ただし実験フラグ下の実装が採択版と同じ挙動である保証はないため、正式に入った6.4へ上げるほうが確実です。実際、SE-0503では実験名SuppressedAssociatedTypesの試作版が採択版とソース互換でなくなり、CHANGELOGに移行を促す警告が出ると明記されました。なお、新しい記法を古いツールチェーンに当てたときほど分かりやすくはありませんが、逆方向の更新でも診断の変更で新たな警告やエラーが出ることはあります。
アップグレードの単位は、ツールチェーンではなくチーム全体のXcode版で揃えてください。macOS Tahoe 26.6への更新が済んでいない端末が1台でもあれば混在が起き、CIのイメージも同時に上げる必要があります。切り替え期間を短くできないなら、6.4固有の記法を入れる時期を全端末の更新完了まで後ろへずらすのが現実的です。バイナリ配布をしているなら、配布物側の互換範囲もXCFrameworkの作成手順と署名の要点で確認しておくと、取り込み側のビルド失敗を避けられます。
よくある質問
Swiftの最新バージョンはいくつですか?
2026年9月19日時点の最新安定版は6.4(swift.orgでの公開日は2026年9月15日)で、Xcode 27(27A266a、2026年9月14日リリース)に同梱されています。6.3系の最終リリースは2026年6月29日の6.3.3でした。
Xcode 26ではSwiftのどのバージョンが使えますか?
Xcode 26系は版によって異なります。Xcode 26と26.0.1はSwift 6.2、26.1と26.1.1はSwift 6.2.1、26.2と26.3はSwift 6.2.3、26.4.1以降の26.5・26.6はSwift 6.3です。Appleのシステム条件ページの対応表がこの帰属の一次情報にあたります。
Swift 6.2の@concurrentは何のための属性ですか?
async関数を呼び出し元のアクターから切り離し、並行に実行させるための属性です。SE-0461でnonisolatedなasync関数が呼び出し元のアクター上で走るようになったため、そこから明示的に逃がす手段として用意されました。ただしこの既定はアップカミング機能NonisolatedNonsendingByDefaultを有効にしたときか、nonisolated(nonsending)と書いたときに適用されます。有効にしている環境では、MainActorから呼ぶ重い同期計算に@concurrentを付け忘れると、そのままメインスレッドの滞留になります。
swift-tools-version: 6.2と書くとどうなりますか?
そのパッケージのマニフェストを解釈できるSwiftPMの最低バージョンが6.2になり、マニフェストは6.2世代のAPIで書かれているものとして扱われます。インストールされているSwiftの版を指定するものではないので、Swift 6.4のツールチェーンでもそのままビルドできます。ただし6.3以降で追加されたマニフェストAPIは、この行を上げるまで使えません。
Swiftのバージョンだけを上げることはできますか?
できますが、用途によって向き不向きがあります。Swiftlyでswift.org配布のツールチェーンを入れれば、Xcodeを更新せずにコンパイラだけ新しくできます。ただしApp Storeへ提出するアプリのビルドはXcodeに同梱されたSDKと組み合わせる前提なので、審査対象のビルドで使うのは避けてください。サーバーサイドSwiftやコマンドラインツール、あるいは新しい言語機能の素振りには適しています。