この記事の要点
- Swift 6.4 がリリースされ、日々のコードを書きやすくしつつ、アプリ・サーバ・システムコード・組み込み・ブラウザまでスタック全体での利用を後押しする改善が入りました。
- Swift Build が Swift Package Manager の既定のビルドエンジンになり、Linux / macOS / Windows で同じ仕組みでビルドできます。Subprocess が 1.0 に到達し、他プログラムを起動・操作するクロスプラットフォームな手段が安定版になりました。
- 相互運用がさらに広がり、
Spanが C++20 のstd::spanと直接ブリッジできるようになり、Swift/Java 相互運用も async / コールバック対応を拡張しました。ブラウザ上での動作も高速化し、JavaScriptKit 経由の WebAssembly ブリッジが最大 40 倍速くなりました。 - Embedded Swift がより高機能になり、existential 型のサポートやマイクロコントローラ向けのエラーハンドリング強化が加わりました。
- メモリ安全性を保ったまま性能が向上し、copy-on-write のオーバーヘッドなしに non-copyable な要素を保持する新しい配列型や、コピーせず反復するための
Iterableプロトコルが導入されました。
主な変更点
よりシンプルで明快なコード
日々のプログラミングを簡潔にする言語面の改善が入りました。いずれも対応するProposalダイジェストがあります。
- optional な
some/any型の自然な記述: optional なsome/any型を書くとき、型を括弧で囲む必要がなくなりました。(some Rocket)?の代わりにsome Rocket?と書けます(SE-0521)。 - コンパイラ警告のソースレベル制御: 新しい
@diagnose属性で、警告の抑制やエラーへの昇格といった挙動をコード内で直接指定できます(SE-0522)。 - 複数ライブラリの名前衝突時にどの API を使うか明示: 同名の API を複数のモジュールが提供する場合、module selector(
::)でどのモジュールの API を使うか明示できます(SE-0491)。 deferブロックでの async 関数呼び出し:deferブロック内に書いた非同期処理はawaitされ、ブロックを抜ける前に完了まで実行されます(SE-0493)。- 必要なクリーンアップがキャンセルされないようにする:
withTaskCancellationShieldAPI で、囲んでいるタスクのキャンセルから保護されたクロージャを実行できます(SE-0504)。
defer ブロック内の非同期呼び出しとキャンセルシールドを組み合わせると、関数がどのように終了してもクリーンアップが確実に走るようにできます。
func processFile(at url: URL) async throws {
let handle = try FileHandle(forReadingFrom: url)
defer {
// flushMetrics is a network call, so it can suspend after cancellation
// is requested; the shield ensures it runs to completion and isn't
// included in cancellation.
await withTaskCancellationShield {
await flushMetrics(for: url)
try? handle.close()
}
}
try await processContents(of: handle)
}
コアライブラリの拡充
Foundation と標準ライブラリの改善により、既存の型でモダンな API を使いやすくなりました。
- ProgressManager に async/await 対応の API が加わりました(SF-0023)。
@Observableな型が、きめ細かく継続的な変更通知を扱えるようになりました(SE-0506)。- Subprocess ライブラリ(SF-0007 として導入され、2025 年に 0.1 版が公開されていました)が 1.0 に到達しました。Swift 並行処理を土台に、サブプロセスの起動と操作をクロスプラットフォームに行えます。
let result = try await Subprocess.run(
.name("ls"),
arguments: ["-la"],
output: .string(limit: 4096)
)
print(result.standardOutput)
Swift Testing まわりでは、既存プロジェクトの移行がしやすくなりました。Swift Testing のテスト内で XCTAssert を、XCTest 内で #expect を安全に使えるようになり(ST-0021)、失敗した期待に表示される値を CustomTestReflectable プロトコルでカスタマイズできます(ST-0022)。swift test ではテストケースを繰り返し実行して原因の切り分けや時間短縮ができ(ST-0024)、Apple プラットフォームでは Transferable プロトコルに適合する添付を記録できます(ST-0023)。
また、Swift にドキュメントサイトができ、標準ライブラリのドキュメント内容がオープンソースになりました。
ビルド・デバッグ・IDE サポート
- より堅牢なデバッグ: コンパイラが Swift モジュールをデバッグ情報でどう追跡するかを刷新する複数リリースにまたがる取り組みが完了し、LLDB は曖昧な名前ベースの探索ではなく正確な依存関係追跡でモジュールを読み込むようになりました。バイナリの Swift モジュールが埋め込まれなくなるため、Linux / Windows のデバッグビルドや Darwin の dSYM バンドルが大幅に小さくなります。詳細は Swift Digest 内のSwift のデバッグ情報におけるモジュール追跡を参照してください。
- IDE を横断した統一ビルドシステム: Swift Package Manager が Swift Build を既定のビルドプラットフォームとして使うようになりました。SPDX / CycloneDX 形式で Software Bill of Materials(SBOM)を生成する機能も含まれます(SE-0509)。
- より広い IDE サポート: VS Code 向け Swift 拡張が Open VSX Registry で公開され、VS Code に加えて Cursor などのツールでも使えるようになりました。Swiftly との連携も加わり、プロジェクトごとに異なるツールチェインを選びやすくなりました。
相互運用とプラットフォームサポートの深化
言語相互運用がさらに深まりました。
- C:
@cと@implementationを組み合わせると、別途 C の宣言を書かずに、C ヘッダの実装を Swift の関数で提供できます。@implementationを付けない場合、コンパイラは宣言を生成ヘッダに出力します。いずれの場合も@c関数は、生ポインタと個数の組の代わりにSpanを使う安全なラッパーを得られます。 - C++: Swift 6.4 は C++20 の
std::spanを Swift のSpanとブリッジします。手作業の変換コードを書かずに、std::spanを期待する C++ API へSpanを渡したり、std::spanをSpanとして受け取ったりできます。 - Java: Swift/Java 相互運用プロジェクトは、async / throwing 関数の呼び出し対応をプロトコルやコールバックのラッパーへ拡張し、クロージャの
Runnableへの自動マッピング、可変長引数のインポート、Java の record 型サポートを加えました。
プラットフォームサポートも深まりました。
- WebAssembly: JavaScriptKit の Wasm ブリッジ性能が向上し、以前の動的なブリッジと比べて安全なブリッジが最大 40 倍高速になりました。Wasm SDK は Swift.org のインストールページから入手でき、ブラウザ向けのコンパイルに追加設定が不要になりました。Foundation の更新により WASI 上の
FileManagerサポートも改善されています。 - Android: Android 向け Swift SDK は新しい LTS NDK 30 でビルドされ、Swift ランタイムライブラリと自分のパッケージの両方に Android の可用性属性を提供します。Swift Build が SwiftPM で Android に対応し、ポストインストールスクリプトが不要になりました。
- Embedded Swift: existential 型(
any Protocolなど)の汎用サポートにより、ヘテロジニアスなコレクションを自然に表現でき、任意のErrorを throw / catch できます。ターゲット全体で有効化できるEmbeddedRestrictions警告も加わりました。詳細は Swift Digest 内のSwift 6.4 でやってくる Embedded Swift の改善を参照してください。
安全性を保ったまま高速なコード
Span・non-copyable 型・InlineArray に関する以前からの取り組みを引き継ぎ、メモリ安全性を保ったまま不要なコピーを避けやすくなりました。いずれも対応するProposalダイジェストがあります。
- 値をコピーせずメモリ上で扱う: borrow / mutate アクセサにより、プロパティ経由で
SpanやInlineArrayを読み書きできます(SE-0507)。non-copyable 型がEquatable/Comparable/Hashableに適合できるようになり、新しいRef/MutableRef型が、1 度に 1 つの値を borrow / mutate できる保持可能なコンテナを提供します(SE-0519)。non-copyable 型の optional も同様に、消費せずに中身を検査・更新できます(SE-0532)。 - 不要なメモリ割り当てなしにコレクションやヒープ上の値を構築する:
UniqueBoxは、参照カウントなしにヒープ上の値(non-copyable な値を含む)を一意に所有するスマートポインタです(SE-0517)。UniqueArrayは、Arrayで生じる copy-on-write の割り当てなしに non-copyable な要素を格納し、動的に伸長するバッファを提供します(SE-0527)。Iterableプロトコルを使うと、各値をコピーせずに要素を borrow しながらループでき、Sequenceの対応範囲を超えた反復ができます(SE-0516)。 - unsafe 注釈付き API を使わずに生メモリへ安全にアクセスする:
withTemporaryAllocationは、自動的に初期化・後始末される一時バッファを提供します(SE-0524)。新しい安全なロード API により、RawSpanとその派生型がバイトを安全にロード・ストアでき、unsafe フラグ付きの関数を置き換えられます(SE-0525)。
Swift 利用者への影響
- ビルドが 3 プラットフォームで揃います。 Swift Build が SwiftPM の既定になり、Linux / macOS / Windows で同じビルドの仕組みを使えます。
- 他プログラムとの連携が安定 API になります。 Subprocess 1.0 により、コマンドラインツールからストリーミング処理まで、他プログラムの起動と操作をクロスプラットフォームに書けます。
- C / C++ / Java / ブラウザとの相互運用が広がります。
Span↔std::spanのブリッジ、@cと@implementationの組み合わせ、Swift/Java の async / コールバック対応、40 倍高速化した WebAssembly ブリッジにより、既存のエコシステムとの接続がしやすくなります。 - メモリ安全なまま性能を追求できます。 non-copyable な要素を扱う配列型や
Iterable、borrow / mutate アクセサ、RawSpanの安全なロード API により、unsafe な API を避けつつ不要なコピーや割り当てを減らせます。 - 組み込み領域での表現力が上がります。 Embedded Swift の existential 型サポートとエラーハンドリング強化により、マイクロコントローラ向けでもより自然にコードを書けます。
関連 Proposal・リンク
- Swift 6.4 に含まれる言語進化のProposal一覧: Swift Evolution dashboard
- 本記事で触れた、Swift Digest 内のProposalダイジェスト:
- 関連する Swift Digest 内の Blog ダイジェスト: