2014/01/10

JSONディクショナリに対してはKVCのCollection Operatorが意外と便利

IIJmioのiOSサンプルアプリでは、NSJSONSerializationで得られたNSDictionaryをそのまま用いていました。

そのため、Key-Value Coding (KVC)を使うことができて、 その中のCollection Operatorsが使ってみて割と便利だったので、利用例を紹介します。

KVCの例

例えば、IIJmioのデータ利用量照会で得られるJSONデータから、30日間のクーポン利用状況の配列を得たいとします。

そのためには、ディクショナリの配列からキーwithCouponの値のみを取り出す操作が必要になります。例えば、Underscore.mを用いると次のようになります。

NSArray* value = Underscore.array(packetLog).map(^id(NSDictionary* e) {
    return @([e[@"withCoupon"] intValue]);
}).unwrap;

これが、KVCを用いると次のようになります。

 NSArray* value = [packetLog valueForKeyPath:@"withCoupon"];

Collection Operatorの例

また、先ほどのJSONデータから30日間のクーポン利用合計を得たいとします。

Underscore.mで書くなら次のようになります。

long long total = [Underscore.array(couponInfo[@"coupon"]).reduce(@0, ^id(NSNumber* v, NSDictionary* e) {
    return @(v.intValue + [e[@"volume"] intValue]);
}) intValue];

もっと簡単に書くには、Collection Operatorsのひとつ@sumを利用します。

NSNumber* total = [self.info.couponInfo valueForKeyPath:@"coupon.@sum.volume"];

@sum以外にも、@avg@min@maxなどもあります。詳細はAppleの公式ドキュメントを参照してください。

おわりに

KVCのCollection Operatorsについて紹介しました。

ちなみに、MioDashboardではMantleを利用しているので、現在は用いていないです。

関連リンク

0 件のコメント:

コメントを投稿

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