この記事の要点
- Swift 5 が正式リリースされました。言語進化における大きな節目であり、最大の特徴は ABI 安定化です。これにより Swift ランタイムが Apple プラットフォーム(macOS / iOS / tvOS / watchOS)の OS 本体に同梱されるようになり、アプリは Swift ライブラリを同梱せずに済むため、ビルドが容易になりサイズも小さくなります。
- 標準ライブラリでは、
Stringの UTF-8 ベースでの再実装、生テキスト(raw text)のための文字列リテラル区切りの強化、Result型と SIMD 型の追加、Stringinterpolation の柔軟化、Dictionary/Setの性能改善が目玉です。 - 言語・コンパイラ面では、メモリへの排他的アクセスの強制がデバッグ/リリース両方でデフォルト有効になり、Python・JavaScript・Ruby などの動的言語との相互運用を助ける dynamically callable 型がサポートされました。
- Swift 5 は Swift 4 / 4.1 / 4.2 とソース互換です。Apple プラットフォーム向けには Xcode 10.2 に同梱され、Linux(Ubuntu 14.04 / 16.04 / 18.04)向けの公式バイナリも提供されます。
主な変更点
ABI 安定化とバイナリ互換性
Swift 5 で、Apple プラットフォーム上の ABI が安定(stable)であると宣言されました。これにより Swift ライブラリが今後のすべての macOS / iOS / tvOS / watchOS リリースに組み込まれます。アプリはこれらのライブラリを同梱する必要がなくなるため、ビルドがより簡単になり、アプリのサイズも小さくなります。
ABI 安定化の意味と、その先に向けた取り組みについては、次の解説記事も参照してください。
標準ライブラリの更新
標準ライブラリには次の新機能が加わりました。
Stringの UTF-8 ベースでの再実装: 内部エンコーディングが UTF-8 になり、多くの場合にコードがより高速になります。この変更の背景は UTF-8 文字列 を参照してください。-
生テキストのための文字列リテラルの改善(SE-0200): 文字列リテラルを
#"..."#のように#で囲むことで、バックスラッシュなどをエスケープせずそのまま書けます。背景は Proposalの舞台裏 — SE-0200 も参照してください。let path = #"C:\Users\test\file.txt"# let regex = #"\d+\.\d+"# -
Result型と SIMD ベクトル型の標準ライブラリへの追加(SE-0235 / SE-0229): 成功・失敗を型で表すResult<Success, Failure>と、ベクトル演算向けの SIMD 型が使えるようになりました。func fetch(_ url: URL, completion: (Result<Data, Error>) -> Void) { ... } Stringinterpolation の強化(SE-0228): データからテキストを構築する際の柔軟性が増し、独自の補間処理を定義できるようになりました。DictionaryとSetの性能改善。
このほか、Swift Evolution プロセスを経た次の標準ライブラリ関連 Proposal も実装されています。
Unicode.Scalarへの Unicode プロパティの追加(SE-0211)DictionaryLiteral型のKeyValuePairsへの改名(SE-0214)NeverのEquatable/Hashableへの適合(SE-0215)DictionaryへのcompactMapValuesの導入(SE-0218)Characterのプロパティ(SE-0221)BinaryIntegerへのisMultipleの追加(SE-0225)Numericを新しいAdditiveArithmeticプロトコルへ refine する(SE-0233)- 標準ライブラリの
Collection階層からの一部カスタマイズポイントの削除(SE-0232) Sequence.SubSequenceの削除(SE-0234)withContiguous{Mutable}StorageIfAvailableメソッドの導入(SE-0237)Range系型へのCodable適合の追加(SE-0239)String.Indexの encoded offset の非推奨化(SE-0241)
言語・コンパイラの更新
Swift 5 では、メモリへの排他的アクセスの強制がデバッグビルドとリリースビルドの両方でデフォルト有効になりました。これにより同じメモリへの重複したアクセスが実行時に検出されます。詳細は Swift 5 の排他的アクセス強制 を参照してください。また Swift 5 は、Python・JavaScript・Ruby といった動的言語との相互運用を改善する dynamically callable 型をサポートします。
Swift Evolution プロセスを経た次の言語 Proposal も実装されています。
- 将来追加される
enumのケースの扱い(non-exhaustive enum /@unknown default)(SE-0192) - coercion を介したリテラル初期化(SE-0213)
- ユーザー定義の dynamically “callable” 型(SE-0216)
- コンパイル条件での ‘less than’ 演算子のサポート(
#if swift(<...))(SE-0224) - identity key path(
\.self)(SE-0227) try?が生むネストした optional の平坦化(SE-0230)
Package Manager の更新
Swift Package Manager にも多くの新機能が加わりました。
- 依存のミラーリング(SE-0219)
- プラットフォームのデプロイメントターゲット設定(SE-0236)
- ターゲット固有のビルド設定(SE-0238)
- コードカバレッジデータの生成
swift runコマンドが、実行可能ファイルをビルドせずに REPL でライブラリをimportできるように
移行とドキュメント
Swift 5 は Swift 4 / 4.1 / 4.2 とソース互換です。Xcode 10.2 には多くのソース変更を自動処理できるコードマイグレータが含まれ、機械的でない変更を案内する移行ガイドも用意されています。Swift 5 に対応した『The Swift Programming Language』の更新版も Swift.org で公開され、Apple Books でも無料で入手できます。
Swift 利用者への影響
- アプリのビルドが容易になり、サイズも小さくなります。 ABI 安定化により Swift ランタイムが OS に同梱されるため、アプリは Swift ライブラリを抱え込む必要がなくなりました。
- 文字列処理が速く・書きやすくなります。
Stringの UTF-8 ベースの再実装で多くの場面が高速化し、生テキストのための#"..."#区切りで正規表現やパスなどをエスケープなしに書けます。 - エラーハンドリングと数値計算の表現力が上がります。
Result型でコールバックの成功・失敗を型で表せ、SIMD 型でベクトル演算を標準ライブラリのまま書けます。 - 動的言語との相互運用が改善します。 dynamically callable 型により、Python・JavaScript・Ruby などとの連携を自然な呼び出し構文で書けるようになりました。
- 移行のハードルは低めです。 Swift 5 は Swift 4 / 4.1 / 4.2 とソース互換で、Xcode のコードマイグレータと移行ガイドが移行を支援します。
関連リンク
- 前のメジャーリリースについては Swift 4.2 リリース を参照してください。
- このリリースの計画と管理方針については Swift 5.0 のリリースプロセス を参照してください。
swift-5.0-branchは、将来のバグ修正向け「ドット」リリースに備えて引き続き開かれた状態に保たれました。 - 本記事に関連する解説記事: ABI 安定性とその先へ / ABI 安定性以後の Apple プラットフォームでの Swift の進化 / UTF-8 文字列 / Proposalの舞台裏 — SE-0200 / Swift 5 の排他的アクセス強制
- 本記事で触れた主な Proposal ダイジェスト:
- Swift のダウンロード
- Swift Package Manager