9月15日、Joe HeckとHolly Borlaが「Swift 6.4 Released」と題した記事を公開した。
Swift 6.4が正式リリースされた。昨年のSwift 6.0でコンカレンシーモデルが刷新されて以来、6.xシリーズは着実に実用性を高めてきたが、今回のリリースでは「Swiftがどこで動くか」という対応範囲の拡張がひとつの軸になっている。特に、WebAssembly(Wasm)ブリッジの最大40倍高速化と、クロスプラットフォームビルドの一本化は、ブラウザ・サーバー・組み込みにまたがるSwift活用を後押しする変化だ。
JavaScriptKit経由のWasm実行が最大40倍高速化
Swiftをブラウザ上で動かすアプローチは、JavaScriptKitを介してWasmモジュールとJavaScriptランタイムをつなぐのが一般的だった。ただ、このブリッジ層の動的呼び出しのオーバーヘッドが実用上のボトルネックとなっており、パフォーマンスを理由にSwift×Wasmの採用を見送るケースも少なくなかった。
Swift 6.4では、このJavaScriptKitを通じたWasmブリッジが従来の動的ブリッジと比較して最大40倍高速化された。Swift製のコードをブラウザ環境で本格活用する上での大きな障壁がひとつ取り除かれた形だ。あわせて、Wasm SDKがSwift.orgのインストールページから直接入手できるようになり、ブラウザ向けコンパイルに必要な追加セットアップも不要になっている。
Swift BuildがSwiftPMのデフォルトビルドシステムに
Swift Package Manager(SwiftPM)のデフォルトビルドシステムがSwift Buildに切り替わった。Swift Buildは、SwiftPMがこれまで内部的に使ってきたLLBuild(低レベルビルドエンジン)を基盤として再設計されたビルドエンジンで、Linux・macOS・Windows間でプロジェクトを同一の方法でビルドできることを設計目標のひとつに掲げている。クロスプラットフォーム開発での「環境差異によるビルド失敗」を減らすことが狙いだ。
あわせてSwiftPMはSBOM(Software Bill of Materials:ソフトウェア部品表)の生成機能を追加している(SE-0509)。SPDX形式またはCycloneDX形式でSBOMドキュメントを出力でき、セキュリティ監査や依存関係管理の要件が厳しい現場では実用的な追加機能だ。
Subprocessライブラリが1.0に到達
非同期でサブプロセスを実行・操作するためのSubprocessライブラリがバージョン1.0に達した。Swift Concurrencyをベースに設計されたクロスプラットフォームのパッケージで、コマンドラインツールからストリーミングプロセスまで扱える。
let result = try await Subprocess.run(
.name("ls"),
arguments: ["-la"],
output: .string(limit: 4096)
)
print(result.standardOutput)
C++20のstd::spanとSwiftのSpanが直接ブリッジ
Swift 6.4はC++20のstd::spanとSwift独自のSpan型を、相互変換コードなしにブリッジできるようになった。C++ APIとSwiftコードの境界で手動の変換処理を書く必要がなくなる。
Javaとのインターオペラビリティも拡張されており、async/throwing関数のプロトコルおよびコールバックラッパーへの対応、クロージャへの自動Runnableマッピング、Javaレコード型のサポートが追加されている。
日常のコーディングに関わる構文改善
いくつかの構文改善も含まれており、毎日書くコードの見通しがよくなる。
- オプショナルの
some/anyがより自然な記法に:(some Rocket)?の代わりにsome Rocket?と書けるようになった(SE-0521) deferブロック内でasync関数を呼び出し可能に:SE-0493によって初めて許可された構文で、defer内の非同期処理が完了するまで待機されるようになったwithTaskCancellationShieldでキャンセルから保護:タスクがキャンセルされても特定のクリーンアップ処理を完走させられる(SE-0504)
deferとキャンセルシールドを組み合わせると、関数の終了経路によらずクリーンアップを確実に実行できる。
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)
}
- モジュールセレクター(
::)で名前衝突を解消:複数のモジュールが同名の型を提供する場合に、どのモジュールの型かを明示できる(SE-0491) @diagnose属性でコンパイラ警告をソースレベルで制御:警告の抑制やエラー昇格をコード上で指定できる(SE-0522)
パフォーマンスとメモリ安全性の両立
コピーを避けつつメモリ安全を維持するための新しい型と仕組みも導入された。Swiftでは値型のコピーが安全性の基盤だが、パフォーマンスクリティカルな場面ではそのコストが問題になる。「コピー不可能な型(non-copyable)」という概念を軸に、今回のリリースでその体系がさらに充実した。
- **
RigidArray/UniqueArray**:コピーオンライト(CoW)のオーバーヘッドなしにnon-copyable要素を格納できる配列型(SE-0527) Iterableプロトコル:Sequenceプロトコルを超える範囲で、要素をコピーせずにイテレートできる(SE-0516)- **
UniqueBox**:参照カウントなしでヒープ上の値を一意に所有するスマートポインタ(SE-0517) - **
withTemporaryAllocation**:自動で初期化・クリーンアップされるスクラッチバッファを安全に利用できる(SE-0524)
その他の変更点
- デバッグ情報の改善:LLDBがモジュールを精確な依存追跡で読み込むようになり、LinuxやWindowsのデバッグビルドおよびDarwinのdSYMバンドルのサイズが縮小された
- VS Code拡張がOpen VSX Registryに公開:Cursor、Kiro等のVS Code互換エディタでも利用可能になった
- Embedded Swiftがexistential型をサポート:
any Protocolのような型が使えるようになり、マイクロコントローラ向けの表現力が向上した - SwiftドキュメントサイトがOpen Sourceに:標準ライブラリのドキュメントがオープンソース化され、docs.swift.orgから参照できる
詳細はSwift 6.4 Releasedを参照していただきたい。