WWDC 2015にて、Appleはプログラミング言語Swiftの新しいバージョンのSwift 2.0を発表した。WWDC 2014で発表されて以来、Swiftはいくつかのマイナーなリリースが行われ、2014年10月のSwift 1.1と今年の4月のSwift 1.2で構文の機能や拡張APIが追加された。Swiftは数年の開発を経て発表された言語で、LLVMを実行エンジンに採用し、C言語のコンパイラの技法を使って、タイプセーフな静的型言語を実現し、Objective-Cのフレームワークやライブラリを使えるようにしている。
Swift 2.0は性能が改善され、新しいエラー処理APIが追加され、可用性検証がファーストクラスでサポートされている。リリースのブログ記事によれば、 Apple SDK"への対応を強化したSwiftによってプラットフォームのAPIより自然になったそうだ。さらに、既存のApple SDKとの統合も、nullabilityとジェネリックアノテーションによって改善された。ジェネリックアノテーションはSwift 1.2で導入されたものだ。エラー処理は業界標準のtry
、catch
、throw
を使っている。エラー処理は言語の機能であって、プログラマを強制するものではないという考えだ。また、プロトコル拡張によって、Objective-Cのカテゴリのような方法で、既存のプロトコルが新しいメソッドに対応できるようになった。これによって、より柔軟にコーディングができる。Swiftの中核のライブラリも拡張され、グローバル関数の代わりに新しい機能が使えるようになった。
Swift 2.0では、新しいバージョンのSwiftでも古いバージョンのSwiftでもコンパイルできるようにする機能が追加されている。これによって、プログラムで新しいプラットフォーム用の条件付きコンパイルコードを使うこともできる。Objective-CでNS_AVAILABLEマクロを使って実現する弱いリンキングのようなものだ。新しいキーワードであるdefer
を使えば、ブロックの最後にクリーンアップの処理を関連付けられる。Goのdefer
ステートメントと同じようなものだ。
30年以上使われているObjective-Cのランタイムはモバイルの世界の広がりの中で老いを見せ始めていた。動的切り替えができるようにするためには、Objective-Cでオブジェクトに送信されるメッセージはobjc_msgSend
関数でメッセージごとにコストがかかる。さらに、最適化コンパイラはディスパッチされたメソッドをインラインにできないため、アプリケーションのコードはランタイムにコードバスを譲らなければならない。
Swiftはこの問題は静的にディスパッチすることで解決している。C++のような言語と同様だ。Swiftのメソッドはクラスごとのvtableにコンパイルされ、最適化コンパイラがインラインにできるようになっている(メソッドがインラインにされるため、JITで最適化のほとんどが行われるというのは、一般的に知られている事実だ)。Swiftは実行時JIT最適化はしない(最適化はすべてコンパイル時に行われる)。しかし、Swiftの言語はかなりシンプルなので、コンパイラは効率的なコードを生成できる。
さらに、Swiftは構造体をオブジェクトとして扱える。これによって、Cの効率さとC++の力の両方を身につかられる。Swiftの構造体の配列はタイプセーフであり、効率的にデータを扱う。小さなデータ型にはメリットがある。Objective-Cとは違い、コレクションクラスもジェネリックなので、コンテンツも安全に保持できる。
Swift 1.xでなかったのは、標準API(フレームワークをSwiftで書くことができる)とオープンソースの実装だ。Swift 2.0のリリースで、AppleはSwiftがOSI承認ライセンスの下でオープンソース化されること、そして、OSXやiOSだけでなく、Linuxでも動作することを約束した。サーバサイドのOSとしてもっとも普及しているLinuxで標準のライブラリやコンパイラが使えるようになることで、OSXではないフレームワークが生まれるのは間違いない。Xcodeはオープンソースにはならないようだ。ほかのIDEがSwiftの特徴を捉えることになるだろう。LLVMとClangがClang BSDライセンスなので、Swiftも同様のライセンスでリリースされるかもしれない。
Appleの開発者プログラムはOSXとiOSで別々の開発者要件を持っていたが、単一の開発者アカウントに更新された。ウォッチOSも含んでいる。さらに、Xcode 7では、iOSデバイスにアプリケーションをインストールするのに開発者メンバシップはもう要求されない。ただし、(無料の)Appleアカウントは必要だ。
アップデート: deferキーワードに言及するため記事を更新した。また、ブログでOSI承認ライセンスでリリースされること、及びApple開発者アカウントにも言及されていたので追記している。さらに、Xcode 7では、開発者プログラムなしでiOSアプリケーションのサイドローディングができることも追記している。