こんにちは、田中です。
3月のtry! Swiftもだんだんと近づいてきましたね、今から楽しみで仕方ありません。
ですが、予習しないとヤバそうな内容の濃さだろうなという危機感も感じています。
仙台のiOS勉強会ではおなじみの@totottiさんもtry! Swiftに出陣するとのことで、同じように「予習したいよね」という話になりこの度try! Swiftに向けたSwiftの予習勉強会として(仮)Sendai.swift 第0回を開催する運びとなりました。

エレベーター脇に貼っていただいていた案内の紙。
うん、シンプルでわかりやすい。
3月のtry! Swiftもだんだんと近づいてきましたね、今から楽しみで仕方ありません。
ですが、予習しないとヤバそうな内容の濃さだろうなという危機感も感じています。
仙台のiOS勉強会ではおなじみの@totottiさんもtry! Swiftに出陣するとのことで、同じように「予習したいよね」という話になりこの度try! Swiftに向けたSwiftの予習勉強会として(仮)Sendai.swift 第0回を開催する運びとなりました。

エレベーター脇に貼っていただいていた案内の紙。
うん、シンプルでわかりやすい。
勉強会について
「そろそろ本格的にSwiftをやろうかな」という方が多くなってきたのかはわかりませんが、8名の方にご参加いただき満員御礼でした。ありがとうございます。今回第0回のテーマはProtocol-Oriented Programming in Swiftでした。
「Swiftではクラスではなく積極的にProtocolを使っていこうぜ!」という感じです。
公式のWWDCのビデオとスライドを見ながら解説や議論をしていきましたので、このエントリの内容もそれに沿った内容になります。
なので、このエントリはビデオとスライド一緒に追いながら見るとより理解が捗るかと思われます。
解説・参考は以下の二つの記事を活用させていただきました。
・Swift 2で提唱されているProtocol Oriented ProgrammingをWWDCセッションから学ぶ
・Swiftにおけるプロトコル指向プログラミング
初回としてはなかなか重めの内容でしたが(自分自身理解がまだ追いついてないです;)、Swiftに関してこういった設計寄りで濃い内容を語らう場というのは仙台では初めてだったのでとても楽しかったです!

議論されたこと
継承問題
Swiftは継承できる親クラスは一つで限られています。そのため継承するクラスは慎重に選ばなくてはいけません。
それに対してProtocolは複数採用することができるため、Protocolで代替できるところはProtocolで書いていく方が良いのかもしれません。
実装内容はサブクラスで定義したい場合
クラスでメソッドを定義する場合は実装内容を書かなくてはいけません。しかしその具体的な内容はサブクラスで定義したい、ということがあるかと思います。
クラスで書く場合は親クラスの実装で
func hoge() { fatalError("implement me!") }などと記述したりするのはよくしがちです。
fatalError()がカッコ悪い!
実装しないなら実装しないでおきたい!
そんな時はProtocolでメソッドの定義だけにとどめておいて、実装はそのプロトコルを採用した先でやればいいですね。
heterogeneous(adj. 異種の)とhomogeneous(adj. 同種の)
┌(┌^o^)┐ホモォ...公式のスライドを引用します。

それぞれで定義した場合の比較です。
違いとしては引数がOrdered型かSelf型かというところ。
そしてジェネリクスを用いたソートを行っているか否かという点です。
heterogeneousの方はOrderedプロトコルを採用した型ならなんでも引数に取り、homogeneousではOrderedプロトコルを採用したSelf型を引数に取り、さらにジェネリクスで定義してあるためその型で統一されている型である必要があります。
どちらが良いかというのは時と場合にはよると思いますが、最適化具合に差があります。
heterogeneousではなんでも引数に取ります。これは何か問題があった場合は実行時にエラーが起こります。(= Dynamic dispatch)
homogeneousでは統一されている型が入ることになっている場合、異なったものを入れるようなことがあればそれはコンパイル時のエラーとなります。(= Static dispatch)
ここがheterogeneousとhomogeneousの違いです。
このあたりに関してはSwift Whole Module Optimizationの話題も出ました。
僕自身詳しくはまだ追えていないので深く言及はしませんが、最適化具合のコンパイラの設定の話かな?
Protocol Extensionっょぃ
既存のプロトコルに対して追加実装を行えるというSwift2からの機能。Appleの標準フレームワークなどに対してもExtensionできるため、便利です。
よくStringにBase64の実装を追加するときなんかとかに使うよねーという話も出ました。
さらにExtensionで書く場合、デフォルトの実装部分も書けるためまた便利です。
デフォルト実装ができるとどこかに変更が必要になった時、クラッシュしたりすることも減ってよりセーフにプログラムが書けるのかなぁということも個人的には考えてました。
where便利そう
制約によって細かく内容を分岐させられるので便利そう。使ってみようじゃないか。
その他
class vs structでどっちを使うべきか?Swiftはできるだけimmutableなものを使って書いていくべき?
など。
懇親会
というかお腹空いたのでご飯と酒を摂取しに、Lucy&Gluttonに行きました。ランチでは前から度々来てましたが、夜は初めてです。

なぜか知的飲料があった。
しかも缶で出た!
ふむ、なかなかやるではないか...!
次回はどうしようとか、シュタゲ話に花を咲かせたり、秋葉原散策の話をしたり、某アイドルグループのメンバーがタイムリープしてるネタ話をしたり...。
とても楽しいディナーでしたw
まとめ
Protocolといえば今まではDelegateを定義するときにしか使ってきませんでしたが、本来のProtocolの使い方としてはこちらの方がメインだよなぁと思いました。ある程度予習も挟んだので濃い内容で議論できてとても充実した勉強会でした!
会場準備やイベント立てなど@totottiさんにおまかせの形になってしまったので、次回開催時はもっといろいろやらせていただきます申し訳ないです;;
次回はもう少しやさしいところから手を動かしながら入って、テーマに沿った内容で実装していくというのも面白いかななんて考えてます。
try! Swiftまでにあと2回くらいはやっておきたいところだ...。
参考リンク
以下二つは公式の内容に沿って解説されています。とてもわかりやすい。・Swift 2で提唱されているProtocol Oriented ProgrammingをWWDCセッションから学ぶ
・Swiftにおけるプロトコル指向プログラミング
もうちょっとやさしい内容でSwiftのProtocolを触りたいという方はこちらの動画がわかりやすいかと思いました。
・Swift Tutorial: Protocol Oriented Programming - Introduction