「Advanced Swift」とは少々大胆なタイトルです。我々がなぜ本書にこのタイトルを与えたのか、その意図を説明することから始めましょう。
本書の第一版の執筆を始めた時点で、Swiftはまだ誕生からようやく1年を迎えたところでした。そして2.0ベータがリリースされる直前にとりあえず執筆を開始しました。とりあえず、というのは、Swiftは2年目で更に進化すると考えていたからです。ほとんどの言語は、これだけ多数の開発者に急速に採用されることはありません。もしかすると、このような急速の浸透を見せる初めての言語かもしれません。
しかし、急激な浸透の後には、まだ回答が存在しない問題が残ります。どのように「Swiftらしい」Swiftを書けばよいのでしょうか?あるコードを書くための正しい方法は存在するのでしょうか?標準ライブラリはある程度のヒントを与えてくれますが、その標準ライブラリでさえ、時間とともに変化しました。しかし、ここまでの2年間でSwiftはハイペースで進化を続けており「Swiftらしい」Swiftの形が浮かび上がってきました。
他の言語から来た開発者は、その言語の好きなところにSwiftを似せられます。低レベルのビット演算は見た目もそのパフォーマンスもC言語と似せられ、しかも不確実な挙動の余地がありません。Ruby使いには、mapやfilterなどで利用するトレーリングクロージャのシンプルな文法に見覚えがあるでしょう。SwiftのジェネリクスはC++のテンプレートに似ていますが、型制約を導入し、実行時ではなく定義時に安全性の確認をします。高階関数の柔軟性と演算子のオーバーロードもサポートし、HaskellやF#のようなコードが書けます。そして@objcキーワードを使って、Objective-Cを使うようにセレクタやランタイムでの動的実行も行えます。
これらのような類似点が存在すると、他の言語の用法も取り入れたいと思うでしょう。例えば、ほぼすべてのObjective-Cのサンプルプロジェクトは機械的にSwiftに移植できます。JavaやC#のデザインパターンも同様です。そしてSwiftの発表からわずか数ヶ月で、Swiftを使ったモナドのチュートリアルを掲載するブログ記事が多数執筆されています。
しかし、ここで不満が出てきます。なぜ連想型を持つプロトコル拡張を、Javaのインターフェイスと同じように使えないのでしょうか?なぜ配列は期待通りの形で共変ではないのでしょうか?なぜ「関手」を書けないのでしょうか?その理由は「それらに該当する部分がまだSwiftに実装されていない」という場合もあります。しかしほとんどの場合は、より「Swiftらしい方法」が存在するか、他の言語の機能と同等とされているSwiftの機能が実は思い描いているものとは違うものだからです。
ほとんどのプログラミング言語と同様、Swiftは複雑な言語です。しかしSwiftはその複雑さを上手に隠蔽しています。Swiftではジェネリクスやオーバーロード、静的・動的ディスパッチの差異を理解しなくてもアプリの開発を始められます。Cライブラリを呼び出す必要も、自作のコレクション型を実装することもないかもしれません。しかし、しばらく開発を続けていると、結局これらを学ばなければならない状況がやってきます。それはコードのパフォーマンスを向上させるためかもしれませんし、よりエレガントで表現豊かなコードにするためかもしれません。または、単に何かを実装するために必要だからかもしれません。
そのような機能の数々を学ぶことが本書の目的です。これまでに我々が参加した様々なフォーラムで登場した「これはどうすれば良いのか?」や「なぜSwiftはこのように動作するのか?」という問いの多くに答えます。本書を読むことでSwiftの基礎を知り、さらに進んだ機能について学び、Swiftの動作をよりよく理解していることを期待しています。本書の内容は、自分自身を「上級Swiftプログラマー」と呼ぶために必須の知識であると思っています。