背景

先月の2ch API切り替え騒動と,Appleの非道審査に絶望していたことからチマチマ作り始めたフレームワークです. redditというのは,アメリカで人気のSNSでユーザ数が1億人以上いるらしいです(ソースなし,どっかで見た).

当初はRedditKitというObj-Cのラッパーで使って,reddit APIをいじっていました. このRedditKitがパスワードベースの認証しかサポートしておらず,近日中にOAuthにredditの認証が切り替わることが運営から通知されているため,早く対応してくれないかなぁ,と私はぼやいておりました.

そこで,私は,swift,APIのラッパー,OAuthの実装の勉強をかねて,reddit APIのswift用ラッパーを実装し始めてみました. まぁ,なんというか,わかりにくいドキュメントであってもちゃんと仕様のあるネットワークAPIは,ラッパーが作りやすいなぁ・・・というのが私の実感です.

swiftとfunctional programming

最初は,optionalの手間に閉口し,if let hoge = hoge as? String {}のsugar syntaxの連発には,辟易していました. 特に,Storyboardを使うとiOSでは,どうしてもoptionalでプロパティを管理する必要があるため,何も考えずにコードを書くと,unwrapあるいはnilチェックだらけになってしまいます. optionalの取り扱いは慣れてきたかなぁと自己評価しています.

reddiftでは,ネットワークの非同期処理の戻り値をブロックのコールバックで処理するときに,多相型で戻り値とエラーオブジェクトをまとめるコードを書いてみました.

// do not use "!" in your code
switch(result) {
case .Failure: 
    println(result.error!.description)
case .Success:
    println(result.value!)
}

オールドタイプな私は,関数型言語の名前くらいしか知らなかったのですが,上記のコードパターンは,典型的なfunctional programmingのものらしいです. これからは,いわゆる古い言語にもこういうパターンが導入されてくるかなぁと思い,関数型言語の勉強を始めてみました.

関数プログラミング実践入門 ──簡潔で、正しいコードを書くために (WEB+DB PRESS plus)

プログラミングパラダイムが今までの言語と違いすぎて,「はじめてのC」を読んでる感じで勉強しています. いつかは,上記のようなパターンを自分でも書けるようになりたいです.

参考文献:Efficient JSON in Swift with Functional Concepts and Generics

諸々のツール

今回,オープンソースでライブラリを作るにあたって,Carthage, cocoapodsのアップデート,ふるまいテストのためのQuickなど,最近,あまりチェックしてなかった(私には)新しいツールを勉強しました. 後々,おもしろかったのをメモがわりにブログに書きたいと思っています.

  1. Carthage cocoapodsが勝手にプロジェクトを作り替えちゃうのが嫌な人向け?のパッケージ管理ソフト.カルタゴ.英語読みだとカーセージみたいな発音.
  2. cocoapods だいぶ前にライブラリの管理がgithubじゃなくなってた.
  3. Quick Behavir Driven Driverのテスト書くためのライブラリ.割と使いやすかった.

reddift

もろもろのドキュメントは,githubcocoapodsにあります.

session?.getList(paginator, sort:sortType, subreddit:subreddit, completion: { (result) in
    switch result {
    case let .Failure:
        println(result.error)
    case let .Success:
        println(result.value)
        if let listing = result.value as? Listing {
            for obj in listing.children {
                if let link = obj as? Link {
                    self.links.append(link)
                }
            }
            self.paginator = listing.paginator
        }
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.tableView.reloadData()
            self.loading = false
        })
    }
})

なるべくSwiftっぽく書けるように作っていきたいと思っています・・・・.