この記事の要点
- Swift 5.8 が正式リリースされました。Swift 6 へ向けた段階的な準備を可能にする upcoming feature flag、開発体験の改善、エコシステム(Swift-DocC・Swift Package Manager・SwiftSyntax)の強化、Windows サポートの洗練が中心です。
- 言語面の目玉は upcoming feature の仕組みで、
-enable-upcoming-featureフラグと#if hasFeature(...)により、Swift 6 で前提となる機能を 1 つずつ前倒しで導入できます。 - 複数の Swift ツールバージョンに対応するライブラリ向けに、宣言の属性を
#ifで囲める conditional attributes(#if hasAttribute(...))が加わりました。 - result builder の実装が刷新され、コンパイル時間・コード補完・診断が改善されました。SwiftSyntax は C++ パーサに依存しない、完全に Swift で書き直された新パーサを採用しました。
主な変更点
言語と標準ライブラリ
upcoming feature flag による段階的な機能導入(SE-0362)
Swift 6 では一部の機能がデフォルトの挙動になりますが、それらをいきなり全部有効にすると既存コードへの影響が大きくなります。Swift 5.8 では、こうした upcoming feature を 1 つずつ前倒しで有効化し、Swift 6 への移行を段階的に進められるようになりました。
upcoming feature はデフォルトでは無効です。有効にするには、コンパイラフラグ -enable-upcoming-feature に機能の識別子を渡します。
-enable-upcoming-feature ConciseMagicFile
ソースコード側では #if hasFeature(機能識別子) で機能の有無を判定できるため、その機能に未対応の古いツールでもコンパイルを通せます。
#if hasFeature(ConciseMagicFile)
// 新しい挙動を前提としたコード
#else
// 従来の挙動を前提としたコード
#endif
Swift 5.8 では、次の Swift Evolution Proposal が upcoming feature として用意されています。
- 簡潔な
#file名(SE-0274、識別子ConciseMagicFile) - trailing closure の前方スキャンマッチング(SE-0286、識別子
ForwardTrailingClosures) - existential の
any明示(SE-0335、識別子ExistentialAny) - 正規表現リテラル(SE-0354、識別子
BareSlashRegexLiterals)
conditional attributes(SE-0367)
複数の Swift ツールバージョンに対応するライブラリでは、新しい属性が古いコンパイラで使えず、保守コストがかさみがちでした。Swift 5.8 では宣言に付ける属性を #if で囲めるようになり、さらに、現在の言語モードのコンパイラがある属性をサポートしているかを判定する hasAttribute(属性名) ディレクティブが加わりました。
#if hasAttribute(preconcurrency)
@preconcurrency
#endif
protocol P: Sendable { ... }
その他の言語・標準ライブラリの拡張
- オプショナルなパラメータへの
any引数の unboxing(SE-0375) - result builder 内のローカルな wrapped property(SE-0373)
- key path のデバッグ表示の改善(SE-0369)
weak selfのアンラップ後の暗黙的なself(SE-0365)StaticBigInt(SE-0368)- ポインタ初期化 API の改善とバッファスライスの強化(SE-0370)
- ソートが安定であることの明文化(SE-0372)
- 関数の back deployment(SE-0376)
開発体験
result builder の実装刷新
result builder の実装が書き直され、コンパイル時間・コード補完・診断が大きく改善されました。新しい実装は、Swift 5.7 で導入された複数文クロージャの型推論(SE-0326)を活用し、result builder の変換を Proposal(SE-0289)の仕様どおりに、複数文クロージャと同じ形で型チェックします。これにより、特に不正なコードでの型チェック性能とエラーメッセージが改善されました。
一方で、新実装は SE-0289 のセマンティクスに沿ったより厳密な型推論を行うため、これまで不正な型推論に依存していた一部の既存コードに影響します。
エコシステム
Swift-DocC
- 書籍「The Swift Programming Language」が Swift-DocC に移行し、オープンソース化されました。これにあわせて、生成ドキュメントの挙動を変える option directive が Swift-DocC に追加されました。
- グリッドレイアウトやタブナビゲータなど、より動的なドキュメントページを作るための directive が加わりました。
- ドキュメントページの色・フォント・アイコンをカスタマイズできるようになり、プロジェクト内をあいまい検索できる quick navigation も導入されました。
- 他モジュールの型へのエクステンションをドキュメント化できるようになりました(Swift-DocC プラグイン使用時に
--include-extended-typesフラグで有効化)。
Swift Package Manager
- upcoming / experimental feature の宣言(SE-0362):
Package.swiftでターゲットごとにenableUpcomingFeature/enableExperimentalFeatureフラグを設定できるようになりました。 - パッケージレジストリの認証(SE-0378): レジストリとのトークン認証に対応し、
swift package-registryに認証情報を追加・削除するlogin/logoutサブコマンドが加わりました。 - artifact bundle で提供されるバイナリターゲットのみからなる実行可能プロダクトを公開できるようになり、バイナリ実行ファイルを独立したパッケージとして配布できます。
- ツールバージョン 5.8 以降のパッケージでは、
Package.swiftに Foundation が暗黙的にimportされなくなりました。Foundation の API を使う場合は明示的にimportします。
SwiftSyntax
Swift 5.8 に合わせた SwiftSyntax では、パーサが C++ に依存せず完全に Swift で書き直されました。コンパイラ本体は当面は従来の C++ パーサを使い続けますが、最終的にはこの新パーサへの置き換えを目指しています。新パーサには次の利点があります。
- SwiftSyntax への貢献や依存が、ほかの Swift パッケージと同じくらい容易になりました。
- エラー回復を主目的に設計されており、パースエラーに寛容で、より良いエラーメッセージを生成します。
- SwiftSyntaxBuilder により、result builder と文字列補間を組み合わせて宣言的にソースコードを生成できます。
Windows プラットフォーム
Windows ツールチェインの段階的な改善が続いています。DEVELOPER_DIR 環境変数への依存の解消、ICU の静的リンク化によるファイル数と依存の削減、Windows での C++ 相互運用に向けた初期作業、vcruntime モジュールの visualc への改称、Swift Package Manager のパス処理の堅牢化、SourceKit-LSP の安定性向上などが含まれます。
Swift 利用者への影響
- Swift 6 への移行を段階的に進められます。 upcoming feature flag により、Swift 6 で前提となる機能を 1 つずつ前倒しで有効化でき、
#if hasFeature(...)で古いツールとの互換も保てます。 - 複数ツールバージョン対応のライブラリが書きやすくなります。 conditional attributes(
#if hasAttribute(...))により、新しい属性を古いコンパイラ向けに条件付きで適用できます。 - 宣言的 UI などの記述が快適になります。 result builder の実装刷新により、コンパイル時間・コード補完・診断が改善されます。ただし不正な型推論に依存していたコードは修正が必要になる場合があります。
- ソースコードを扱うツールを作りやすくなります。 完全に Swift で書き直された SwiftSyntax により、パーサやコード生成への入り口が下がりました。
- 注意点として、 ツールバージョン 5.8 以降のパッケージでは
Package.swiftに Foundation が暗黙importされなくなったため、Foundation の API を使うマニフェストは明示的なimportが必要です。
関連 Proposal・リンク
- 前のリリースについては Swift 5.7 リリース を参照してください。
- 本記事で触れた Proposal ダイジェスト:
- Swift 5.8 に含まれる言語進化のProposal一覧: Swift Evolution dashboard
- Swift のダウンロード
- The Swift Programming Language