渡辺ご師匠様より献本頂いたので「Swift 2標準ガイドブック
swift概要から入り、基本文法、swift特有の機能、実際に使う場面での方法についてと、徐々に実践的な内容を解説していく書籍となっています。
目次はマイナビさんのページに載っています。
一般的なプログラミングをする上で必要な文法解説をしています。ifやforなど…一通り学べばswiftでとりあえず何か書くということはできると思います。
しかし、基本的なプログラムの書き方以外にもswiftの特徴を活かしてバグを減らす書き方、パフォーマンスのいい書き方、保守性の高い書き方など、既に知っている人から見ても役に立つことも書かれたりしています。(自分が無知とも言う)
その中で気になったりしたものを一部ご紹介いたします。
コメントの書き方についていろいろな書き方を書かれています。
コメントもマークダウンみたいに書けるんです!そう、swiftならね!(知らなかった)
マークダウンなどで装飾して書いておくとコードヘルプできちんと整形されて表示されます。
プログラムを書く上で保守性というのは大事なので、見やすいコメントを書いておくのは次世代の保守する人たちのためにもなるので大事ですね!
時にはこんな真実に気付かされることもありました。
42pより引用
Swift では、Float よりも Double の方が処理速度が速いため、特別な理由でもない限りは
Double を使用しましょう。型を指定せずに小数点の値を入れると、Double として扱われます。
速度に違いがあるなんて全く知りませんでした!!
よくCGFloatとか出てたのでその勢いでなんとなくFloatのほうがいいのかなと思って使ったりしてたりしました。
今後はDoubleを使っていくように致します。。
swiftらしい書き方や、swiftで書く際のメリット、genericや型エイリアス、カリー化、そしてswift2から追加されたプロトコルエクステンションなどなど、swiftならではのことも隅々まで書かれております。
時には分かりやすい図とともに書かれているのできっと理解しやすいことでしょう。
(カリー化の図とかなんか箱が可愛い・・・!)
swiftの演算子をカスタマイズする方法なども解説されていますが、これを見て日付とかをカスタム演算子でやると楽になるようなライブラリがあったなぁと想い出しました。
🐔 Toolkit to parse, validate, manipulate, compare and display dates, time & timezones in Swift. - GitHub - malcommac/SwiftDate: 🐔 Toolkit to parse, validate, manipulate, compare and display dat... GitHub - malcommac/SwiftDate: 🐔 Toolkit to parse, validate, manipulate, compa... - GitHub |
let date1 = NSDate.date(fromString: "2015-01-01T00:00:00.000Z", format: DateFormat.ISO8601)
let date2 = NSDate.date(fromString: "2015-01-11T00:00:00.000Z", format: DateFormat.ISO8601)
if date2 > date1 { ... } // or >=
if date2 == date1 { ... }
if date2
日付の比較とかって結構めんどくさいのでそういった直感的に使えない内容はカスタム演算子などを使って直感的に使えるようにするというアプローチはswiftならではという感じがしますね。
67p 判定による制御より
Swift では条件式を囲む()は省略できますが、その後の {} は省略できません。
C 言語の文法をベースにする多くのプログラミング言語では、if 文で実行される処理が1行で ある場合は {} を省略できます。しかし、括弧がないことに気付かず処理を追加した結果、処理の 流れが想定とは異なるものになってしまい、予期せぬ不具合を引き起こす可能性があります。 そのため、Swift の言語仕様では {} を省略できないようになっています。
swiftの仕様からバグを減らせるメリットなどを説明されています。
仕様からもswiftの良さやありがたみというのを知ることが出来ます。
「3-7-2のパターンマッチングの正体」では、switchの挙動を解説しつつそれを踏まえた上で正規表現を使ったswitchの実装法などを解説されています。
細かい挙動を知ることで今後の実装にも幅を広げることが出来ますね!
またまた蛇足ですが、{}の徹底というところで、goto fail問題を思い出しました。
でも、swiftならこういう問題も未然に防ぐことが出来ますね。
恐らく初心者が最初にひっかかるであろう「?」や「!」などのoptionalまわりについて、まるまる1章を使ってものすごく事細かにかかれており、利用法も学ぶことができます。
初めてswiftのコードを見た時は、この「?」や「!」ってなんやねん!「??」って2つあるけど何が違うねん!!とか思ったりもしましたが、これをみることで一挙にその問題を解決できます。
optionalは必ず使うところなので、是非swiftを始める方には一読してもらいたい箇所かと思います。
ここを読むことでcrashしにくいコードが書けるようになるはず・・・です!
5章目くらいから標準ライブラリを用いた実装法やアトリビュート、obj-cとの共存など、基本的なことから抜けだして一步踏み込んだ内容を解説されています。
アトリビュートでは、基本的なアトリビュートももちろん紹介されていますが、swift2からの@availabilityや@testableなどもきちんと紹介されています。
しかし、驚いたのははなんと、ドキュメントには載っていないアトリビュートまで解説されていました!
そんな存在があることすらも知らなかったので思わず驚愕してしまいました。
なんだかswiftの攻略本を見ている感じになりますね。
今後混在していくであろうswiftとobjective-cの同居方法の解説や、移行の進め方など細かく実践的に解説されています。
また、単に移行するだけでなくswiftらしい書き方で移行する術が書かれています。
後半では、サンプルでのアプリを用いてswiftとobjcの混合で作る方法を解説されていますが、そうすることでswiftの利点をより把握しやすくなっています。
今後swiftのコードは増えていくとは思われますが、それでも既存のobjective-cの資源というのは中々なくなるものでもないと思うので、うまい共存のやり方を知っておくとより保守範囲を広められるのではないかと思います。
最後の章はユニットテストや新しく追加されたUIテストのやり方、c言語を介した他言語との拡張、alamofiieをはじめ使うと便利なライブラリ、実装におけるデザインパターンなど、実装においてより実践的な内容が紹介されています。
デザインパターンなどは自然といつの間にか使っていたというパターンも中にはいくつかありますが、いろんなパターンを覚えておいて、実践で効率的につかえるのがいいと思います。
余談ですが、著者の一人の富家先生にはこの本には書いてないですが、GoFにあったvisitorパターンを教わってこんな実装法もあるんだなと衝撃を受けた記憶があります。
随所には役に立つコラムも挿入されています。
ジェンキンスのようなCLIでビルドする時に使えるようなコマンド一例や、細かいプロトコルの説明などなど。コラムを読んでいくことでもより実践的なことができるようになっていけるようになります!
ビルドのコマンドは本当に何度もパラメータ変えていじったりとかしてましたなぁ。。。(蘇るjenkinsおじさんの介護時代)
さりげなく、愛犬「ゆきち」が代入した値として使われていることから渡辺さんの愛犬への愛を感じることができます。
サンプルによっては人としても扱ってます。家族としてとても愛を注いでいるのかが読み取れます。
ちなみに他のサンプルで「ゆきち」のほかに「どんた」という名前が出ていたのですがこれが何の名前かはわからずじまいでした・・・。
お友達ですかね・・・?
随所随所にソースを綺麗にさせるための仕組み、コツなどが記されているので、本書を読むことでよりswiftのコード力が上がるのではないかと思います。
また、objective-cとの差異も記載されているので、もともとはobjective-cを触っていてこれからswiftをいじってみようと考えてる方も挙動の違いを把握できる一冊にもなっているのでオススメできるような内容になっています。
全体のレベル感としては完全な初心者というよりはある程度はiOSをいじったことがある方を対象にしている感はありますので、ある程度iosの実装の流れを予習してから読んでみるとちょうどいいのかなとは思います。
確実により良いswiftコードがかけるようになると思うので是非読んでみるといいです!
こんにちは。virapture…
View Comments
Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.