この記事の要点
- Swift 4.0 が正式リリースされました。Swift 3 の強みを土台に、堅牢性と安定性を高め、標準ライブラリを改善し、アーカイブとシリアライズなどの機能を追加したメジャーリリースです。
- 最大の特徴は、Swift 3 とのソース互換を保てる新しい互換モードです。コンパイラは Swift 3.2 モードと Swift 4.0 モードの 2 つをサポートし、モジュール単位で自分のペースで Swift 4 へ移行できます。
- 言語・標準ライブラリ面では、より高速で使いやすい
String実装、substring のサポート、Collection周りの改善、そしてstruct/enumのアーカイブと型安全なシリアライズ(Codable)が目玉です。 - Apple プラットフォーム向けには Xcode 9 に同梱され、Linux(Ubuntu 16.10 / 16.04 / 14.04)向けの公式バイナリも提供されます。
主な変更点
言語・標準ライブラリの更新
Swift 4.0 はメジャーな言語リリースであり、Swift Evolution プロセスを経た多数の変更を含みます。主なテーマごとに整理すると次のとおりです。完全な一覧は元記事を参照してください。
String
Swift 4 では、Unicode の正しさを保ちつつ、より高速で使いやすい String 実装が導入されました。substring の生成・利用・管理のサポートも追加されています。関連する主な Proposal は次のとおりです。
Stringの改訂(コレクション適合、C 相互運用、トランスコーディング)(SE-0163)- 複数行の文字列リテラル(SE-0168)
CharacterへのunicodeScalarsプロパティの追加(SE-0178)Stringのインデックスの見直し(SE-0180)- 文字列リテラル内での改行のエスケープ(SE-0182)
- substring 向けの性能改善(SE-0183)
Collection
Collection 系の型の生成・利用・管理に関する改善が入りました。
- ジェネリックな subscript(SE-0148)
Dictionaryの keys / values 用のカスタムコレクション(SE-0154)DictionaryとSetの機能拡張(SE-0165)- 片側だけの範囲(one-sided ranges)(SE-0172)
MutableCollection.swapAt(_:_:)の追加(SE-0173)
アーカイブとシリアライズ
Swift 4 は struct 型と enum 型のアーカイブをサポートし、JSON や plist といった外部フォーマットへの型安全なシリアライズを可能にします(SE-0166)。これが Codable プロトコルとして提供されるものです。型を Codable に適合させるだけで、エンコード・デコードのコードを自前で書かずに済みます。
struct Landmark: Codable {
var name: String
var foundingYear: Int
}
let landmark = Landmark(name: "Mojave Desert", foundingYear: 1994)
let data = try JSONEncoder().encode(landmark)
let decoded = try JSONDecoder().decode(Landmark.self, from: data)
そのほかの言語更新
このほか、Swift Evolution プロセスを経た次の Proposal も実装されています。
- protocol 指向の整数型(SE-0104)
- 関連型を制約する
where句の許可(SE-0142) - クラスとサブタイプの existential(SE-0156)
@objc推論の制限(SE-0160)- protocol エクステンションでの
finalサポートの削除(SE-0164) private宣言とエクステンションの相互作用の改善(SE-0169)NSNumberブリッジと数値型(SE-0170)inoutを使うreduce(SE-0171)- メモリへの排他的アクセスの強制(SE-0176)
swift runコマンド(SE-0179)
新しい互換モード
Swift 4 では、新しいバージョンのコンパイラを使うためにコードを変更する必要があるとは限りません。コンパイラは 2 つの言語モードをサポートします。
- Swift 3.2 モード: Swift 3.x コンパイラでビルドできていたソースの大部分を、そのまま受け付けます。ソース互換を保つため、標準ライブラリや Apple 提供 API の既存 API に対する更新はこのモードには現れません。一方で、Swift 4 の新しい言語機能の多くはこのモードでも利用できます。
- Swift 4.0 モード: Swift 4.0 の言語・API 変更をすべて含みます。多くのプロジェクトでいくらかのソース移行が必要になりますが、過去のメジャーリリース間の変更と比べると変更点はかなり控えめです。
言語モードはコンパイラの -swift-version フラグで指定され、Swift Package Manager や Xcode が自動で扱います。この仕組みにより、新しい Swift 4 コンパイラを使い始めつつ、モジュールを 1 つずつ自分のペースで Swift 4 へ移行できます。
Package Manager の更新
Swift 4 では、Swift Package Manager に新しいワークフロー機能とより完全な API が導入されました。
- 最初の公式リリースをタグ付けする前に複数パッケージを並行して開発したり、複数パッケージのブランチをまとめて作業したりしやすくなりました。
- パッケージの product が正式に定義され、パッケージがクライアントへ公開するライブラリを制御できるようになりました。
- 新しい Package API により、パッケージのビルド方法やソースのディスク上の構成について、作者がより細かく設定できます。古いパッケージとのソース互換を保ちつつ、API がより整理されました。
- macOS では、悪意あるマニフェストの影響を抑えるため、パッケージのビルドがネットワークアクセスとファイルシステム変更を禁止するサンドボックス内で行われるようになりました。
関連する主な Proposal は、product 定義(SE-0146)、top of tree 開発のサポート(SE-0149)、ブランチのサポート(SE-0150)、マニフェスト API の再設計(SE-0158)、カスタムターゲットレイアウト(SE-0162)、依存解決の改訂(SE-0175)、swift run コマンド(SE-0179)、C / C++ 言語標準のサポート(SE-0181)です。
ドキュメント
Swift 4.0 に対応した『The Swift Programming Language』の更新版が Swift.org で公開され、Apple の iBooks ストアでも無料で入手できます。
プラットフォーム
- Apple(Xcode): Apple プラットフォーム向けの開発では、Swift 4.0 は Xcode 9 の一部として提供されます。Swift.org からツールチェインをダウンロードすることもできます。
- Linux(Ubuntu 16.10 / 16.04 / 14.04): これらの Ubuntu 向けの公式バイナリがダウンロードできます。
Swift 利用者への影響
- 移行のハードルが大きく下がります。 Swift 3.2 / Swift 4.0 の 2 つの互換モードにより、Swift 4 コンパイラを使い始めつつ、モジュール単位で自分のペースで移行できます。Swift 3.2 モードでは Swift 3 のソースの大部分がそのままビルドでき、新機能の多くも利用できます。
Stringがより速く・使いやすくなります。 Unicode の正しさを保った高速な実装と substring のサポートにより、文字列処理が書きやすく効率的になりました。複数行の文字列リテラルや改行のエスケープも使えます。- シリアライズが格段に楽になります。
Codableへの適合だけで、struct/enumを JSON や plist と型安全に相互変換できます。エンコード・デコードのボイラープレートを書く必要がなくなりました。 - パッケージ管理が成熟します。 Package Manager の API 再設計と product 定義、ブランチ・top of tree 開発のサポートにより、複数パッケージの並行開発やクロスプラットフォーム開発がより実用的になりました。
関連リンク
- 前のメジャーリリースについては Swift 3.0 リリース、その後のマイナーリリースについては Swift 3.1 リリース を参照してください。
- このリリースの計画と管理方針については Swift 4 のリリースプロセス を参照してください。
swift-4.0-branchは、将来のバグ修正向け「ドット」リリースに備えて引き続き開かれた状態に保たれました。 - 本記事で触れた主な Proposal ダイジェスト:
- String: SE-0163 / SE-0168 / SE-0178 / SE-0180 / SE-0182 / SE-0183
- Collection: SE-0148 / SE-0154 / SE-0165 / SE-0172 / SE-0173
- アーカイブとシリアライズ: SE-0166
- そのほかの言語更新: SE-0104 / SE-0142 / SE-0156 / SE-0160 / SE-0164 / SE-0169 / SE-0170 / SE-0171 / SE-0176 / SE-0179
- Package Manager: SE-0146 / SE-0149 / SE-0150 / SE-0158 / SE-0162 / SE-0175 / SE-0181
- Swift のダウンロード
- Swift Package Manager