Build Insiderオピニオン:小野将之(5)

Build Insiderオピニオン:小野将之(5)

Swift 3.1のリリースプロセスおよびそれに含まれる変更内容の紹介(前編)

2016年12月26日

Swift 3.1のリリースが2017年春に迫ってきた。今回は前後編に分けて、そのリリースプロセスや変更内容を解説する。前編ではリリースプロセス/互換性/開発版のSwiftを利用する方法を取り上げる。

小野 将之
  • このエントリーをはてなブックマークに追加

 現時点でのSwiftの正式最新版は3.0.2であり、着々と次期バージョンの開発が進んでいる。また、2016年12月9日にSwift 3.1のリリースプロセスの公式アナウンスもあった。今回は現在進行しているSwiftの開発状況、およびSwift 3.1に含まれる変更内容などを紹介していく。

Swift 3.1 Release Processの紹介

 2016年12月9日に「Swift 3.1 Release Process」というSwift 3.1リリースプロセスの公式アナウンスがあったので紹介する。

Swift 3.1のリリース予定時期

 Swift 3.1のリリース予定時期は、2017年春とのことである。過去のリリース日については「Swift 3のリリース前に、これまでの進化の変遷をなぞる - Build Insider」で列挙したが、1系と2系の大きめのアップデート日は次のようになっていた。

  • Swift 1.2/Xcode 6.3: 2015年4月8日
  • Swift 2.2/Xcode 7.2: 2016年3月21日

 Swift 3.1についてもこの辺りの時期に新しいバージョンのXcode(恐らくはXcode 8.3)と同時にリリースされるはずである。

ソースコードの互換性

Swift 3.0を境にソースコード互換性が大きく向上し、3.1対応では基本的にコードの変更が不要になる

 Swiftはこれまでアップデートのたびに破壊的変更が続いていて、マイナーアップデートでも毎度必ず破壊的変更を含んでいた。特に3.0は過去最大の変更量になったために苦労させられた開発者も多かったが、これを境にSwiftは大きく安定化している。

 これを象徴しているのが、3.0.1と3.0.2では3.0で書かれたコードがそのままコンパイルできることだ。そして、3.1でもこれと同じく基本的にコードの変更なしにコンパイルできる予定である。ただ、これまで意図せずコンパイルが通ってしまっていたものを正すコンパイラーのバグフィックスなどは含まれる。もしその影響を受けるような(本来はエラーとなるべきであった)コードはコンパイルエラーになってしまうが、これもかなり限定的で、ほとんどのプロジェクトは3.0のコードを一切変更することなく3.1でもコンパイルが通るはずである。

 つまり、Swift 3.1はソースコード互換性について注力された初のマイナーアップデートとなる。このことについて、Chris Lattner氏もTwitterで次のように言及している。

Swift 4でのソースコード互換性

 Swift 3.1の話から少し脱線するが、4.0でのソースコード互換性についても触れておきたい。4.0に向けても互換性は大事にされていくが、多少の破壊的変更が含まれてしまうことが予定されている(とはいえ、3.0のときの変更に比べるとはるかに少なく済むはずである)。また、「SR-2582: Add -swift-version command line flag」で示されているように、Swift 4のコンパイラーは、フラグを指定することでSwift 3のコードをそのまま(Swift 4と互換性がない書き方をしていても)コンパイルすることも可能となる。

  • -swift-version 3 Swift 3のコードをそのままコンパイル可能とするフラグ
  • -swift-version 4 Swift 4非互換の書き方がなされていた場合、コンパイルエラーとなるフラグ

 つまり、3.0までの変更と比べてSwift 4では破壊的変更が限定的になることに加えて、上記フラグを使うことでその変更追従も先送りできるようになる予定である。Xcode 8.0以上からSwift 3系が標準となったものの、移行措置としてXcode 8.2まではSwift 2.2と互換性の高い2.3を使えるが、それと似たような対応がSwiftのコンパイラーレベルでなされたともいえる。

 また、-swift-version 3フラグを指定してビルドしたモジュールと-swift-version 4フラグを指定してビルドしたモジュールは、同じSwift 4のコンパイラーによって生成したモジュールなので、お互いにリンクが可能である。例えば、次のようなこともできるので、これまでSwiftのバージョンアップ時に足かせになっていた、古いバージョンのSwiftで書かれたライブラリの扱いがかなり楽になるはずである(これまでは対応されるのを待つか、自らForkするかPull Requestするかなどして対応する必要があった)。

  • Swift 4対応済みで-swift-version 4フラグを指定してビルド済みのライブラリを、-swift-version 3フラグが設定されているプロジェクトで利用可能
  • Swift 4未対応のライブラリを-swift-version 3フラグを指定してビルドして、それをSwift 4対応済みで-swift-version 4フラグが設定されているプロジェクトで利用可能

 上記のSwiftのソースコード互換性およびそれに対する考えは、「[swift-evolution] Details of what source compatibility with Swift 3 means」に詳細に書かれている。

Swift 3.1 beta版の配布法

 これまで、開発中のSwiftはある程度安定したタイミングで定期的にプレビュー版として配布されていたが、3.1ではそれをせずにスナップショット版としてのみ配布されるようになるとのことである。その理由としては「プレビュー版として配布していくやり方では、配布のタイミングが不定期に大きく空いてしまうことがあり、新しい機能の仕様やバグ修正確認などのフィードバックサイクルがうまく回りにくかったなどの問題があったこと」が挙げられている。

 スナップショット版は、継続的インテグレーションの仕組みの上で出力されており、高い頻度で自動的に更新されていくので、それを利用して最新の開発版Swiftを試していける。また、スナップショット版のファイルサイズは300MBほどと比較的軽量(Xcode版スナップショットの場合)なので、4.5GB程度とサイズの大きなXcode本体と比べて気軽に更新可能である。

Swift 3.1~4の開発プロセス

 2017年の早いうちにSwift 4の開発にシフトしたいことから、3.1はスコープの限られた変更となる。2017年1月16日まではmasterブランチで開発を続け、それ以降はswift-3.1-branchブランチにおいて3.1のコードを正式版リリース品質に仕上げるためのクリティカルな修正作業にフォーカスする予定である。このタイミングでmasterブランチはSwift 4開発用となるため、Swift 3.2はリリースされずに3.1系のマイナーアップデート程度にとどまるであろう。

2017年1月16日まで:

  • masterブランチ: Swift 3.1開発
  • swift-3.1-branchブランチ: 隔週でmasterブランチがマージされる

2017年1月16日以降:

  • masterブランチ: Swift 4開発
  • swift-3.1-branchブランチ: Swift 3.1リリースへ向けての開発

 Swift 3.1 Release Processの後半には、Swift 3.1開発に向けてのPull Requestの仕方などが載っているが、本記事では割愛する。

スナップショット版Swiftの利用法

 上でSwift 3.1を今試してみるにはスナップショット版を使う必要がある(ただし、しばらくしたらXcode 8.3 betaがリリースされて、スナップショット版を使わずともある程度は試せるようになるかもしれない)ことを述べたが、ここではmacOSでそれを利用する方法を紹介しよう。

 まずは、スナップショット版をダウンロード&インストールする。

 すると、/Library/Developer/Toolchains/配下にswift-DEVELOPMENT-SNAPSHOT-2016-12-15-a.xctoolchainのようなtoolchainディレクトリが配置されるとともに、Xcodeアプリ上でToolchainsメニューから選択できるようになる。

インストールしたスナップショット版はメニューバーの[Xcode]-[Toolchains]から選択できる

 Xcode上でスナップショット版のSwiftを使いたい場合は、ここから選ぶだけでよい。ただ、試した後、正式版に戻しておかないと通常の開発時のトラブルの原因になりかねないので、注意が必要である。

 コマンドライン上で使いたい場合は、いくつか方法がある。

方法1: パスを通す

 上で、/Library/Developer/Toolchains/配下に配置されると書いたが、swift-latest.xctoolchainというシンボリックリンクが最新版を指しているので、次のようにすればパスを通せる。

Bash
$ export PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:"${PATH}"
スナップショット版の最新版へパスを通す

 もちろん、任意の古いスナップショット版を使いたい場合は、シンボリックリンクではなく明示的にその版の指定が必要である。

方法2: 環境変数TOOLCHAINSにswiftをセットする

 次のコマンドだけでスナップショットの最新版を使えるようになる。

Bash
$ export TOOLCHAINS=swift
環境変数TOOLCHAINSを設定するだけでもよい

方法3: kylef/swiftenv: Swift Version Managerを利用

 kylef/swiftenvを使うことで、rbenvpyenvと同じ感覚で複数のSwiftバージョンを使い分けられるようになる。スナップショット版だけでなく、複数のXcode同梱のSwiftのバージョンの切り替え(通常、XcodeアプリのGUIで切り替え/sudo xcode-select -sコマンド/DEVELOPER_DIR環境変数セットのいずれかの操作が必要)にも対応していて便利である。

 Homebrewでインストールし、swiftenvをロードするように.bash_profileファイルなどに設定を記述すれば使えるようになる。

Bash
$ brew install kylef/formulae/swiftenv
$ echo 'if which swiftenv > /dev/null; then eval "$(swiftenv init -)"; fi' >> ~/.bash_profile
swiftenvのインストールと設定

 例えば、現在のディレクトリでは特定のスナップショット版を使いたい場合は次のように使う。

Bash
$ swiftenv local DEVELOPMENT-SNAPSHOT-2016-12-15-a
$ cat .swift-version 
→ DEVELOPMENT-SNAPSHOT-2016-12-15-a
$ swift --version
→ Apple Swift version 3.0-dev (LLVM 217eb6c2b6, Clang 34a98ce92e, Swift 1eb5648c46)
Target: x86_64-apple-macosx10.9
swiftenvで実行するSwiftのバージョンを指定

 便利ではあるものの、公式のやり方ではないのでその点の注意は必要である。副作用など気になってやはりswiftenvを消したくなることもあると思うが、その場合は、.bash_profileファイルに記述した設定を削除し、次のコマンドを実行すればアンインストールできる。

Bash
$ rm -fr ~/.swiftenv
$ brew uninstall swiftenv
swiftenvのアンインストール

 また、IBM Swift Sandboxでも、比較的新しめのスナップショット版(12月20日執筆時点でDev Build (Dec 15, 2016))を選択できるので、よりお手軽にWeb上で試すことができる。このIBM Swift Sandboxに関しては、Swift 3.1を先取り👀 - Qiitaで触れている。

 後編では、Swift 3.1に含まれる変更内容を、上で説明したスナップショット版で試しながら紹介していく。

小野 将之(おの まさゆき)

小野 将之(おの まさゆき)

学生時代から情報系の専攻、プログラミングのアルバイトなどでコンピューターに親しむ。

その後、大手SIerを経て、4年ほど前から複数のベンチャー企業でiOSアプリ開発をメインとするようになった。

SwiftはWWDC 2014年にベータ版が発表された直後から、ずっと触り続けている。

2015年からQiitaで多数の記事を書き、好評を集めている(http://qiita.com/mono0926)。

現在は株式会社Vikonaのエンジニアとして、JOIN USのiOS版アプリ開発に加えて、Ruby on RailsによるサーバーAPI開発もこなしている。

※以下では、本稿の前後を合わせて5回分(第2回~第6回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

2. Swiftは3.0で安定するのか? リリース予定日と新機能リスト

2016年後半のリリースが予定されているSwift 3。そのリリースに先駆けて、どんな変更点があるのか、懸案となっている互換性はどうなるのかなどを見ていく。

3. Swiftの開発体制、swift.org/Swift Evolutionリポジトリとは?

次期Swiftに搭載予定の新機能といった最新情報はどこで入手できるのか。Swiftについての情報を常にキャッチアップするために見ておくべきサイトを紹介する。

4. Swift 3.0でなぜ「Cスタイルのforループ」「++/--演算子」などの仕様が廃止されたのか

大規模な破壊的変更が行われる最終的なバージョンといわれているSwift 3.0がついに正式リリース。多数の変更から「廃止」となった言語仕様にフォーカスを当て説明する。

5. 【現在、表示中】≫ Swift 3.1のリリースプロセスおよびそれに含まれる変更内容の紹介(前編)

Swift 3.1のリリースが2017年春に迫ってきた。今回は前後編に分けて、そのリリースプロセスや変更内容を解説する。前編ではリリースプロセス/互換性/開発版のSwiftを利用する方法を取り上げる。

6. Swift 3.1のリリースプロセスおよびそれに含まれる変更内容の紹介(後編)

Swift 3.1のリリースが2017年春に迫ってきた。今回は前後編に分けて、そのリリースプロセスや変更内容を解説する。後編ではSwift 3.1に取り込まれることが想定される変更点を取り上げる。

イベント情報(メディアスポンサーです)

Azure Central の記事内容の紹介

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • 日本マイクロソフト株式会社
  • グレープシティ株式会社