【セッションレポート】Developers.IO 2015 で 続・ゲンバのSwiftを発表しました!#cmdevio2015D
CM Developers.IO meetup 2015 Session D-1
昨日3月29日に開かれました Developers IO meetup 2015 のD-1セッション で続・ゲンバのSwiftと題して、Swiftを現場でどのように用いているかについて発表しました。
発表スライド
Content of session
Enum
Swiftで導入されたEnum(列挙型)の機能を実際の開発でどのように用いているかについて発表しました。
離散値とEnum
性別や血液型、決まった期間などの離散値は単純にInt型やDouble型として扱うと、決まった離散値以外の値を取りうるためにアサーションの実装の必要や、APIによる400 Bad Reqest のレスポンスの可能性があります。
このために、このような値に対してはEnumとして宣言を行い、決まった値が必ず入るようにIOを制限し、かつSwiftのEnumに対する網羅的チェックの機能を使うことでアサーションの必要がないことを話しました。
リソースとEnum
Enumに対するリソースハンドリングとして従来のObjective-CでのNS_ENUMを用いた場合はリソースクラスへのカテゴリ拡張で対応したり、コンバータクラスを作成したりしていました。
SwiftでのEnumに宣言できる計算型プロパティを用いることでEnumそのものにリソースを取得する機能をもたせて、記述を簡素化している点を話しました。
エラーとEnum
BrightFuturesに宣言された Result<T>型を用いることでObjective-Cでの定型的なNSErrorポインタのライトバック渡しによるエラーハンドリングを置き換えている事をお話しました。
また、Optional<T>型をまず例にとって、map, flatMap(Swift 1.2より導入) の適用例を紹介した後にResult<T>型に対する map, flatMap メソッドの適用方法についてお話しました。
Collection API
実践 CollectionAPI
map, filter, reduce などの関数を引数として渡すようなAPIをフル活用してコードから如何にして状態を排しているかについてお話しました。実際のコードではfor文をつかうことはなく、map等を使えばObjective-Cでやっていたような冗長なマッピング用メソッドの記述も省けることなどもお話しました。
map, filter, reduce
Array<T>を例として、mapやfilter, reduce メソッドを図解した上で従来の書き方と対比してどのくらいコードが簡潔になるかについてお話しました。
配列などに対するSwiftのAPIは関数型言語の知識を前提とするものが多くあり、それらを図解してブログにまとめようとする構想は以前から個人的にはあったのですが、今回の発表がそのいい機会になったのでよかったです。
flatMap(Swift 1.2)
Swift1.2でSequenceTypeプロトコル、CollectionTypeプロトコルに追加される予定のflatMapについてArray<T>を例として前節と同様の方法で図解して説明しました。
BrightFutures
Futures in Swift
SwiftのOSSのうちFutureと呼ばれる非同期処理の為の概念を実装したものについてまずSwiftzを 槍玉 例にあげました。
Swiftzはプロジェクトに導入するには巨大過ぎ、また演算子に特殊文字が利用されているなどの点から採用を見送ったことを説明した後、BrightFuturesの話に入って行きました。
Future
非同期処理に際してのエラーハンドリングの為に、エラーの可能性を含んだResult<T>に非同期処理のペンディングのコンテキストを含んだFuture<T>を使っていることをお話しました。Future<T>の取りうる3つの状態を図解して説明しました。
Promise
Promiseと呼ばれるクラスを用いて非同期ブロック処理をどのようにしてFutureをつかった処理に置き換えるかについてお話しました。また、BoltsFrameworkとの対比でPromiseを用いたFutureの生成方法についても比較しました。
メソッド概観
Futureに対して定義された諸メソッド(onComplete, onSuccess, onFailure, map, flatMap)を図解して説明しました。
Pluggable Activities
BrightFuturesを実際に使っていてどのような点がよかったかについてお話しました。 設計段階でのアクティビティ図とコードがほぼ一対一に対応したのは特に強調してよかったよかった、と何度も説明しました。
おまけ
3つの項目でmap, flatMapというメソッドを説明したので、それらを適用できる抽象的な概念として Fuctor, Applicative, Monadについて触れた後、Swiftは言語的にHaskell, Scala等の先達に負っている部分があり、これらの巨人を参照しつつコードを書いていきたいとまとめました。
感想
わりと最後のおまけはゲンバ感がなかったのですが(笑)、発表したいことをやりたいままに自由に発表できたので満足しています。関数型のフローを図解する試みはわりと楽しかったので今後もブログで続けて行きたいです。