2014/01/13

配列やディクショナリ向けに関数型言語風の関数を追加するライブラリUnderscore.mを使う

Underscore.mは簡単に言えばUnderscore.jsのObjective-C版です。

導入方法はCocoaPodsで簡単なので省略します。利用方法もいろいろな日本語サイトで解説しているので省略。

ここでは、IIJmioのiOSサンプルアプリケーションでの利用例を少しだけ紹介します。

ひとつめは、ネットワーク通信でディクショナリからクエリ文字列 (foo=bar&hoge=fugaのような文字列) を作成する場合です。

NSDictionary* query_dic = @{@"foo":@"bar",@"hoge":@"fuga"};
NSURLComponents* comp = [NSURLComponents componentsWithString:@"http://api.example.com/auth"];
comp.query = [Underscore.dict(query_dic).map(^id(id key, id obj) {
    return [NSString stringWithFormat:@"%@=%@", key, obj];
}).values.unwrap componentsJoinedByString:@"&"];

comp.URLNSURLに変換できます。

逆に、OAuth2のコールバックURLに付いたフラグメントからパラメータを取るときにも使っています。

NSDictionary* params = Underscore.array([request.URL.fragment componentsSeparatedByString:@"&"]).reduce(@{}, ^(NSDictionary* a, NSString* str) {
    NSArray* kv = [str componentsSeparatedByString:@"="];
    return Underscore.extend(a, @{ kv[0]:kv[1] });
});

なお、前者に関してはAFNetworking 2.0のAFHTTPRequestOperationManagerを利用すれば、パラメータをディクショナリでそのまま渡せるのでもっと楽に書けます。

おわりに

Underscore.mの利用例を紹介しました。

なお、大量のブラケット ([]) がなくなる代わりに、Xcodeでの補完が難しくなるのがちょっと困りものです。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。