石川さんから『Swift 実践入門』を頂いたので、見所などを綴ってみました。

技術書評

石川洋資さんから、彼と西山勇世さんと共著の Swift 入門書を頂いたので、その見所などを綴ってみました。

基本と実践が良いバランスで織り交ぜられていて、言語仕様だけに止まらない内容が印象的、充実感を味わえる読みやすい本な印象でした。


石川さん(@_ishkawaさん )さんから、彼の著書『Swift 実践入門 』を頂きました。

石川洋資さんと西山勇世さんのお二方が記された、Swift の基礎から実践までを上手なバランスで収録した入門書です。

石川さんといえば、かつて参加した 第3回 iphone_dev_jp 東京iPhone/Mac勉強会 で登壇されている姿を眺めていたのをよく覚えているのですけど、その後もいろいろな場面で活躍されている様子が届いてきて、特に印象的に残っているのは Swift 2 シンポジウム #2 で、以前に こちら でも紹介しましたけれど、@noreturn について熱く語る彼の姿でした。

そんな彼が Swift の本を出すと知り、これは読みたい!と思っていたのですけれど まさかのご本を戴けて とても嬉しい限りです。

もしかしたら初の Swift 入門書

Swift 言語の書籍といえば、これまでオススメできそうな本って Apple 公式の解説書 The Swift Programming Language くらいしかなくて、そもそも Swift 言語が登場して間もない頃に本がたくさん登場してから、今日までずっと新しい本が出ていなかったので、期待は高まるばかりです。

今なら Swift 全体を見渡しながら綴ることができるでしょうから、今までにない ちゃんと Swift 言語にフォーカスした本 になっているんだろうな、っていうのがこの本に向けた最初の期待でした。

対象読者と印象

出版社のサイトを見ると、対象読者は次のように書かれていました。

つまり、必ずしも簡単にはすまない本ということになると思います。けれども これから Swift を学びたい人 ともあるように、前半では Swift の基礎的なところも丁寧に細かく記されています。中盤から後半にかけては Swift の機能をどう使っていくかを焦点に綴られていて、少し難しくなりますけれど、どうやって Swift を使っていったらいいかを 窺い知る、貴重な機会 になりそうです。

前半の基礎的なところも丁寧に考えが綴られているので、上級者でも復習という点で 物足りなさを感じることはなさそう です。中盤から後半にかけては、初級者には難しく感じられるところかもしれないですけど、必要になったら辞書的に眺めてみるくらいの気持ちで読むと為になりそうです。こういう考え方ってそうそう古くならないと思うので ゆっくり読んで行けば大丈夫 そうです。

各機能の解説は、けっこう細かく書かれているんですけど、それでいて必要以上に深追いしていないところも良い印象でした。広く深めに、この本をぜんぶ眺めれば、ひととおり詳しく把握できるのは嬉しいところです。トリビア的な話は控えめになっていて、取捨選択、けっこう工夫されたんだろうなっていうのが伝わってくる印象でした。

それとすごく余談ですけど、本のサイズがすごく良いです。個人的に A5 判って持ちやすくて好きなんですよね。

気になる内容

そんな Swift 実践入門で、興味を惹かれたところを簡単に紹介しておきますね。

目次自体は Swift実践入門 ──直感的な文法と安全性を兼ね備えた言語(WEB+DB PRESS plusシリーズ)|gihyo.jp … 技術評論社 に全部書いてありますけど、たくさんあって捉えにくいので、章・節くらいを中心に、自分の感じた読みどころ・興味どころなどと合わせて、綴ってみますね。

どんなところに着目して読むと楽しくなりそうか、そんな参考にしてもらえたら幸いです。

1章 – Swift はどのような言語か

おきまりの最初の章です。Swift がどんな言語か、それを使うための環境など『これから Swift を始めよう』という人にとってはとても大事な内容です。

この章の見所は 言語の特徴 です。静的片付けとは何か、nil 許容性とは、ジェネリクスとは、そんなあたりが数ページで端的に記されています。これらの特徴は Swift と仲良くなる上で大切な下地と思うので、これらが ざっくり見渡せるのは嬉しい です。

プログラミングの初心者には意味がわからないかもしれませんけど、この考え方に触れておくか否かで、きっと将来は大違いなので『なるほど、わからん』くらいの 軽い気持ちでさらっとぜんぶ読んでおくのをオススメしたい ところです。

Mac 以外で Swift したいとき

ちなみにこの本では macOS で Xcode を使う視点で綴られていますので、Linux 環境の人は Swift.org - Welcome to Swift.org からダウンロードすることになると思います。Windows 10 でもたしか Ubuntu 環境が使えたような気がするので『Swift に興味があるけれど Mac 持ってないしなー』という人は、ぜひ Ubuntu 環境を使って Swift を遊んでみてください。

そこまででなくても、ブラウザーだけで気軽に Swift を実行できる IBM Swift Sandbox ですとか、iPad で本格的に Swift を遊べる Swift Playgrounds というアプリもあります。

2章 – 変数、定数と基本的な型

Swift のもっとも基礎となる部分で、変数の扱い方や生存範囲の説明があります。そして、真偽値型、数値型、文字列型、配列型、辞書型、範囲型、オプショナル型、タプル型などの基礎的な型の紹介があって 入門やおさらいにぴったり な章です。型キャストについても触れられています。

当たり前とも言える基礎の解説ですけど、特に Swift 言語は 型がカギを握る印象 なので、ここをしっかり押さえておくか否かで Swift を見渡す力に差が出て来そうです。各型の特徴などがとても丁寧に記されているので、ひととおり Swift を学んだ人こそ、じっくり読むと良さそうです。P26 に『型の確認方法』と称して type:of: や Quick Help を使った方法が紹介されているところもよかったです。そう、こうやってけっこう確認したくなることあるんですよね。

Double 型について

P36 の Double についてわずかに補足しておくと、書籍内の『浮動小数点型に対する演算結果が無限大となった場合』とあるところは、厳密には 『その浮動小数点数型で表現できる最大の値を超えると』 と表現すると、少なくとも Double 型の振る舞いを見る限りでは語弊がないかもしれません。

最大の値に、仮数部がプラス方向に動く値を加えると無限大になります。

let v = Double.greatestFiniteMagnitude    // 1.797693134862316e+308
let w = v + 1e+292                        // inf

そんな浮動小数点数については、以前に カジュアル Swift 勉強会 で発表した『Protocol-Oriented Programming 夢と現実の狭間 』で遊んでみたことがあるので、興味があれば眺めてみてください。

プロトコル指向 - 夢と現実の狭間 #cswift from Tomohiro Kumagai

キャストについて

Swift で型を振り替える演算子として、記号付きの as!as? と、記号なしの as とがあります。こちらの本では アップキャスト" と "ダウンキャスト" に注目して紹介されていますけど、実行時でないとキャストできるかわからないものは 記号付きの as を使い、コンパイル時にキャストできることが自明のものは 記号なしの as を使う、みたいに捉える方法もあります。

これらの演算子はキャスト以外でも使える場面があって、たとえば、リテラルから型への変換や、ReferenceConvertible 機構によって NSDataData とを相互変換(ブリッジ)するときは、型の振り替えが絶対にできることがコードレベルで保証されているので、記号なしの as を使うことになります。

ちなみに ReferenceConvertible については Objective-C Bridge の仕組とそこから感じたこと - Qiita に記したことがあるので、興味がある人は参考にしてみてくださいね。以前は ObjectiveCBridgeable という名前でした。

3章 – 制御構文

条件分岐と繰り返し処理に関する解説の章です。冒頭で プログラムの実行フロー と称して、制御構文がどうして必要になるのかみたいなことに軽く触れられているところが、いいなって思いました。

それぞれの構文の特徴に細かく触れられているので、どうしてそうなっているのか、どうしてそう動くのか、みたいなところに注目して 読むと良さそうです。特に guardswitch 、それとパターンマッチあたりは意識してじっくり読むと良さそうです。P84 の if との使い分けのところも、わかりやすい具体例が添えられていてオススメです。

パターンマッチ

case キーワードを使ったパターンマッチについても、詳し目にさらっと解説されていて良い感じです。パターンマッチはいろんな表現があって、なかなか 自力でいろんなパターンを発想するのが難しい ので、P100 からの 5 ページで紹介されている内容は、目を通しておきたいところです。

そんなパターンマッチについては、以前に著者の石川さんが勉強会で細かく解説されていた資料があります。こちらも合わせて眺めると、より一層、パターンマッチのイメージが掴めそうです。

4章 – 関数とクロージャ

初級者がステップアップする上で もっとも肝心どころと思える 関数とクロージャーを解説されている章です。これらはもともと複雑な機能なので、理解するのも難しく、この章をじっくり腰を据えて解説を読むことになると思います。

読んでみて難しいと感じる人もいると思いますけれど、丁寧に細かく書かれているので、とりあえずなぞるように試しながら読むと、あとあと効いてくるはずなので ちょっと根気を持って臨んでおくのをオススメ です。自分でコードを書くにも、誰かのコードを読むにも、この章で語られている事柄はとっても大事です。ここを知ることが Swift を知る近道とも言えそうですし、どうやったら Swift が上達できるか分からないという人には、ここをオススメしたいところです。

特に クロージャによる変数と定数のキャプチャクロージャ式を利用した変数や定数の初期化 のところは、こういう使い方もあるんだ!みたいなことを知れる貴重な解説がされているので、ちょっと背伸びしたい人にオススメの項です。

5章 – 型の構成要素

"型" という視点で、それに共通する事柄を解説する、面白い視点の章です。

型というと、クラス、構造体、列挙型、関数型、タプル型みたいにそれぞれバラバラで眺めてしまいがちですけれど、こういう視点で横断すると、それぞれの特色の違いが窺えたりして面白いので、こういう構成で綴られているのがすごく良いなって感じました。

この中で、プロパティーがけっこう奥深くて、保存型 (stored) とか計算型 (computed) とか、前者の場合はオブザーバー (willSetdidSet ) とか、後者の場合はセッター (set ) やゲッター ( get ) といったものがあって、そんなあたりの書式や動きに着目すると、プロパティーの扱い方が広がりそうです。ちなみにこれらはプロパティーだけでなく 普通の変数に対しても使える のも面白いところです。

willSet で受ける変数名

ちなみに P137 の willSetnewValue という名前が好ましくない場合は、自分で新しい値を受け取る変数名を指定することも可能です。ついでに余談ですけど、そういえば保存型プロパティーに初期値を記載した時って変数の型を省略できるんですね。

var price = 100 {

    willSet (newPrice) {

        print("Old Price", price)
        print("New Price", newPrice)
    }
}

イニシャライザーとかの話も面白い

他にも、イニシャライザーと型拡張あたりについても触れられていて、そんなあたりも Swift の特徴的な機能なので、一読の価値ありです。

ちなみに余談ですけれど、型拡張で追加できるイニシャライザーは、クラスの場合は convenience 相当のイニシャライザーに限られたり、構造体で自動実装されるかもしれないメンバーワイズイニシャライザー (P168) に影響しないところみたいな、型拡張のちょっとした性格の違いみたいなところも着目すると面白かったりします。

イニシャライザーについては P176 の イニシャライザの種類と初期化のプロセス でかなり詳しく説明されているので、こちらも必読です。

6章 – 型の種類

ここから、中級ステップな感じの話題になります。型の種類と題して、それぞれの型の性格から見た使い分けについて綴られているのが、この章の見所と言えそうです。なぜ、型を使い分ける必要があるのか、そんなあたりにも冒頭で触れられていて良い感じです。

mutating についての補足

P162 と P167、そして P198 で出てくる mutating キーワードについても、意識を傾けてじっくり読みたいポイントです。

このキーワードの特徴に、値型と参照型の観点を絡めると、クラスと構造体の役割の違いが浮き上がってきたりします。変数と定数の振る舞いの違い、とりわけ定数でクラスを扱った時と構造体を扱った時とで違ってくる振る舞いと絡めてみると、グッと視野が広がります。mutating は Swift の中核を握る 重要なキーワードのひとつ です。

7章 – プロトコル

Swift と言えば、誰もが知りたいプロトコル、それについて "インターフェイス定義" という観点で丁寧に解説された章です。ここを読めば、プロトコルの書き方をひと通り理解できるので、取っ掛かりとして読んでおきたいところです。

後半では プロトコルエクステンション標準ライブラリのプロトコル と題して プロトコルならではの特徴的なポイント が紹介されています。前者は ディフォルト実装による実装の任意化 のところに注目すると、プロトコル拡張のイメージが掴みやすいかもしれません。後者は、標準ライブラリーでよく目にするプロトコルがいくつか取り上げられて、それについての振る舞いが説明されていて、プロトコルの実際の使われ方を感じるのに良い項です。

プロトコル拡張の追加資料

プロトコル拡張については、著者の石川さんが勉強会で解説されていた資料があるので、紹介しておきますね。こちらは少し難しいですけど、ステップアップするのに良い資料です。

他にも、自分がプロトコル拡張について発表した資料 Swift 2.0 大域関数の行方から #swift2symposium もあるので、ついでにこちらも紹介しておきます。プロトコル拡張は知れば知るほど Swift の世界が掴める印象なので、石川さんの本で基本を掴んだら、上で紹介した石川さんや自分のスライドを眺めて見ると良いことあるかも知れません。

Swift 2.0 大域関数の行方から #swift2symposium from Tomohiro Kumagai

ついでにものすごく余談ですけど、この2つの資料、僕と石川さんとで同じ日に発表した資料なんですよね。同じ話題を同じ舞台で共に発表しあえた楽しい日は、忘れられない思い出です。同じところに興味を持てるって嬉しいことです。

8章 – ジェネリクス

ステップアップに不可欠なジェネリックについての章ですけれど、ここの副題が 汎用的な関数と型 と綴られていて、そこに興味を惹かれました。そんな意識を念頭に常に置いて、この章を眺めるとイメージを掴みやすくなりそうです。

ジェネリクスは理解しにくい難しいところでもあるせいか、この本では最初の最初、ジェネリクスの意義的なところから丁寧に綴られている のが印象的でした。端的にまとまっているし、具体的な使い方、ジェネリクスを使うならではの良さが説明されていたりして、ジェネリクスの入門として良い感じです。

こういう、ジェネリックの本質的なところがしっかり解説された資料って、ほとんどないと思うんですよね。既にジェネリクスを理解した人も、読んでおくのが賢明そうです。

9章 – モジュール

ここから上級者への入り口かな?と思えるような、新しい視点の章な印象でした。

モジュールと聞くと、なんとなくライブラリーを作る人が知れば良さそうな先入観を持つかも知れないですけど、Swift では言語的にも 名前空間 という大事な役目を持つんですよね。アクセスコントロールにも大きく関与してきて、そんなあたりがちゃんと綴られていて、個人的に この本の最高に素晴らしいと感じたところ だったりします。

Swift 言語の視野を広げるためにも、ぜひ読んでおきたいところです。

それと P243 の "モジュールヘッダーの閲覧方法" も何気なくよく使う機能なのでオススメです。

10章 – 型の設計指針

実践入門の名前にふさわしい章の始まりですね。

クラスと構造体をどう使い分けたら良いか、その理由は何か といったことが綴られている嬉しい章です。他にもプロトコルを選ぶべき指針や、オプショナルを扱う時に考えたいことも記されていて、ページ的には 22 ページくらいの量ですけれど Swift 言語を知りたい欲をたっぷり満たしてくれる章 でした。

ちなみに、この章で紹介されているコピーオンライトについては、自分も以前に勉強会で発表したことがあるので、その資料を紹介しておきますね。NS Prefix 外伝 … Copy-On-Write #関モバ

NS Prefix 外伝 … Copy-On-Write #関モバ from Tomohiro Kumagai

11章 – イベント通知

イベント通知ってなんだろう…? って思ったんですけど、開いてみると、今の iOS/macOS アプリ開発では特にお馴染みのイベント駆動な処理について Swift の観点だとどんな表現になるか が記されている、これもまた実践入門の何ふさわしい内容でした。

デリゲートパターン

純粋な Swift の枠を超えて、そもそもデリゲートパターンとはどういったものか、それで使うメソッド名はどんな雰囲気になるか、Swift ではどんな実装になるか、実装する際の注意は、など、とてもきめ細やかな解説は、読んでいてい嬉しくなります。どういう時にデリゲートパターンを選ぶべきか も綴られていて、アプリづくりの基礎知識としても必見です。

クロージャー

同じようにクロージャーを使ったコールバック的な実装にも触れられていて、ここで特に weak と unowned の使い分け が、ちゃんと両者対等目線で記されているところに感動しました。

ここの 場合によっては実行時エラーを招く unowned キーワードに比べ、weak キーワードのほうが安全であるため、常に weak キーワードを選択しておけば良いと思うかも知れません。しかし、 と綴られているところ、とにかくここが最高です。こういうのって、なかなか知る機会に巡り会えないと思うんですよね。そんなところを知り得ることも、この本の見所に思います。

12章 – 非同期処理

Swift には、言語純粋な非同期処理の機構がないですけど、コアライブラリの GCDFoundation で提供されている機能を使って Swift で非同期処理を行う方法が、そもそも非同期処理とは何かというところから 丁寧に記載されています。

アプリ作りでは非同期処理はもはや欠かせない機能なので、それを Swift で扱う方法が記されているのは嬉しいところです。こうして、Swift 言語の入門書として、最初の言語仕様的な話から、こういう実用で不可欠な機能までが 1 冊の本にまとめられているのは嬉しいところです。

13章 – エラー処理

ここに来て "エラー処理" が登場するのが、上手だなーって感じました。エラー処理といえば、Swift に慣れてくるにつれて、とっても気になるところですよね。Swift では標準的に、オプショナル、エラーハンドリング、強制終了の 3 種類をエラーを知らせるための手段として用意されていますけれど、それぞれの特徴や使いどころが紹介されていて どれを選んだら良いかの指針を窺い知れる のが、この章の見所に感じます。

Result

それに加えて、Swift 標準機能ではない Result という概念のエラー処理も紹介されています。この仕組みは、石川さんが製作しているライブラリ ishkawa/APIKit: Type-safe networking abstraction layer that associates request type with response type. でも積極的に使われている方法です。

この Result は、標準機能ではないといっても、Swift の良さを活かして組み立てられているので、その存在を学べることは Swift の理解向上にも貢献してくれそうです。なのでこの P313 から始まる Result の解説は そういうものもあるんだ という意識を超えて、その仕組みの面白さにも意識を向けて読んでみるのをお勧め したいところです。

14章 – 実践的な Swift アプリケーション

総まとめ的な内容が嬉しい章です。

GitHub API を使ってリポジトリを検索するアプリを作ろうという題材ですけど、さすが ishkawa/APIKit を作成している人が携わる書籍とあって、すごく安心感のあるコードが綴られて行く様がとても印象的 でした。途中 API 仕様のモデル化 という項が登場したり、エラーの表現の仕方が記されていたり。Swift の勘所がしっかり解説されていました。

Swift をひと通り学習したけれど、さあ、どうやって書いたらいいんだろう、そんな悩みを打破してくれる、すごく良い章に感じました。Xcode でプロジェクトを作るところから、コードを組み上げて、実際に動かすところまで、順を追って丁寧に解説されているので、実際に手を動かしながら学んで行くと 相当なレベルアップにつながりそう です。

15章 – Swift から Objective-C を利用する

総まとめを終えてからの Objective-C を利用する話が登場して、ちょっと嬉しく感じた最終章です。

そう、Swift は Objective-C との連携も考慮して作られている言語なんですよね。Swift について語られるとき、何かと Objective-C は邪魔者扱いされがちな印象がするんですけど、個人的には Objective-C もけっこう好きで、そして何よりそんな Objective-C を受け入れている Swift の姿勢が好きだったりします。この本の Swift を用いていたとしても、これらの Objective-C の資産を利用しない手はありません という言葉はトキメキます。

相当詳しい…!

この章、最終章でおまけ的なものかと思いきや、初歩的なところだけに止まらず、Swift で利用することを想定して Objective-C のコードに味付けするための機能、軽量ジェネリクスや __kindof キーワードや nil 許容性指定のためのキーワードが丁寧に解説されていたり、Swift で使う Objective-C コードを書くときの勘所などが記されていて かなり有意義な章 です。

@objcdynamic の違いとか、知らなかったんですけど、そんなあたりもしっかり綴られていて素晴らしかったです。ちなみに動的ディスパッチについては AnyObject も面白かったりします。それについては、自分が以前に発表した資料 AnyObject – 自分が見落としていた、基本の話 に綴ってあるので、興味がある人は眺めてみてください。

AnyObject – 自分が見落としていた、基本の話 from Tomohiro Kumagai

終わりに

ざっくりと全章を辿ってみましたけれど、基礎と実用がバランスよく 記されていて、初級者も上級者も楽しめる本になっている印象でした。解説も深くなりすぎるところはしっかり剪定している印象で、今は知らなくても十分みたいな機能紹介は敢えて省かれているので、読みやすいかなって感じました。

実践入門とあるように、初めて Swift を触れる人には、第一印象として 少し難しいと感じるかも知れないけれど、ステップアップして行くのにちょうど良い内容が記されていると思うので、ためらわず、むしろ日を追うごとに読めるようになっていくのを楽しんだら良さそうです。特にこの本の6章以降の、考え方を窺い知れる本って今のところないと思うんですよね。とりあえず眺めて 迷うようなら、買っておいて損のない本 のように感じました。

Swift を知れば知るほどに、この本の良さが凄くよく感じられてくると思います。

さて、そんな感じで Swift 実践入門 の見所をざっくり抽象的に紹介してみました。もしこの本を手に取ったら、ぜひ上記の見所とかも意識しながら楽しく読んでもらえたら嬉しいです。Swift を楽しんで参りましょう。