この記事の要点
- Swift 3.1 が正式リリースされました。標準ライブラリの改善・洗練を中心としたマイナーリリースで、Swift 3.0 とソース互換です。IBM やコミュニティの貢献による Linux 実装の多数の更新、そして Swift Package Manager の機能拡充も含みます。
- 言語面では、
Sequenceプロトコルへのprefix(while:)/drop(while:)の追加(SE-0045)、Swift バージョンによる@available指定(SE-0141)、失敗可能な数値変換イニシャライザ(SE-0080)など、Swift Evolution プロセスを経た変更が入りました。 - Apple プラットフォーム向けには Xcode 8.3 に同梱され、Linux(Ubuntu 14.04 / 16.04 / 16.10)向けの公式バイナリも提供されます。
主な変更点
言語変更
Swift 3.1 はマイナーな言語リリースで、Swift 3.0 とソース互換です。次の言語変更を含み、その多くは Swift Evolution プロセスを経たものです。
-
Sequenceへの新しいメンバー追加(SE-0045):Sequenceプロトコルにprefix(while:)とdrop(while:)が追加されました。prefix(while:)は先頭からpredicateがtrueを返す間の要素を取り出し、drop(while:)は先頭からpredicateがtrueを返す間の要素を読み飛ばして残りを返します。let numbers = [1, 2, 3, 10, 4, 5] numbers.prefix(while: { $0 < 5 }) // [1, 2, 3] numbers.drop(while: { $0 < 5 }) // [10, 4, 5] -
Swift バージョンによる availability 指定(SE-0141):
@available属性で、宣言のライフサイクルを Swift のバージョンで表現できるようになりました。たとえば Swift 3.1 で削除された API は次のように記述します。@available(swift, obsoleted: 3.1) class Foo { //... } -
数値変換イニシャライザの改善(SE-0080): すべての数値型に、情報を失わずに変換できる場合のみ成功し、そうでない場合は
nilを返す失敗可能なイニシャライザのファミリーが追加されました。 -
UnsafeMutablePointer.initialize(from:)の非推奨化と置き換え(SE-0147):Collectionを受け取るUnsafeMutablePointer.initialize(from:)が非推奨となり、Sequenceを受け取るUnsafeMutableBufferPointerの新しいメソッドに置き換えられました。メモリ安全性の向上と、シーケンスからのメモリ初期化の高速化を目的としています。
Linux 実装の改善
IBM やコミュニティの貢献により、Linux 版の Foundation 実装が大きく前進しました。
NSDecimal/NSLengthFormatter/Progressの実装URLSessionの機能向上(API カバレッジの拡大、libdispatchの利用最適化)NSArray/NSAttributedStringなど多数の型での API カバレッジの改善Dataの大幅な性能改善と、JSON シリアライズ性能の向上NSUUID/NSURLComponentsなどでのメモリリーク修正- 特に
URLSessionを中心としたテストカバレッジの向上
Package Manager の更新
Swift Package Manager にも複数の機能が追加されました。
- 編集可能パッケージ(SE-0082): パッケージ依存はデフォルトでツール管理のビルドディレクトリに保存されるようになり、
swift package editコマンドで特定パッケージを「編集モード」にしてユーザー管理下(Packagesディレクトリ)へ移し、依存更新の対象外にしながら変更をコミット・push できるようになりました。 - バージョンの pin 留め(SE-0145): 使用中の各依存のバージョンが
Package.pinsファイルに記録され、チェックインして他の利用者と共有できます。swift package pin/swift package unpinで制御でき、swift package updateで許容範囲の最新バージョンへ再解決して pin ファイルを更新します。 - ツールバージョン(SE-0152): パッケージが必要とする Swift ツールの最小バージョンを
Package.swiftの先頭に記録できるようになりました。新しいツールを要求するパッケージは古いツールの依存解決では無視されるため、古い Swift ツールを使うクライアントを壊さずに新機能を採用できます。 - Swift 言語互換バージョン(SE-0151): パッケージのソースが Swift 3 と Swift 4 のどちらの言語バージョンで書かれているかを指定できるようになりました。未指定の場合は最小ツールバージョンから推測されます。
このほか、依存解決の正しさの改善、swift test --parallel によるテストの並列実行、--enable-prefetching による依存の並列取得などの改善も入りました。
移行とドキュメント
Swift 3.1 は Swift 3.0 とソース互換です。それ以前のリリースからの移行を助けるため、Xcode 8.3 には多くのソース変更を自動処理できるコードマイグレータが含まれ、機械的でない変更を案内する移行ガイドも用意されています。Swift 3.1 に対応した『The Swift Programming Language』の更新版も Swift.org で公開されています。
Swift 利用者への影響
- 既存コードへの影響は小さいです。 Swift 3.1 は Swift 3.0 とソース互換であり、多くのコードはそのままビルドできます。
UnsafeMutablePointer.initialize(from:)を使っているコードなど一部では非推奨化への対応が必要になりますが、Xcode 8.3 のマイグレータが移行を支援します。 - 標準ライブラリの表現力が増します。
prefix(while:)/drop(while:)や失敗可能な数値変換イニシャライザにより、条件付きのシーケンス操作や安全な数値変換を簡潔に書けるようになりました。 - クロスプラットフォーム・パッケージ管理が成熟します。 Linux 版 Foundation の機能・性能の向上と、編集可能パッケージ・バージョン pin 留め・ツールバージョンといった Package Manager の機能拡充により、サーバーサイドやチーム開発での Swift 利用がより実用的になりました。
関連リンク
- このリリースの計画と管理方針については Swift 3.1 のリリースプロセス を参照してください。
swift-3.1-branchは、将来のバグ修正向け「ドット」リリースに備えて引き続き開かれた状態に保たれました。 - 前のメジャーリリースについては Swift 3.0 リリース を参照してください。
- 本記事で触れた主な Proposal ダイジェスト: SE-0045 / SE-0141 / SE-0080 / SE-0147 / SE-0082 / SE-0145 / SE-0152 / SE-0151
- Swift のダウンロード
- Swift Package Manager