at_yasu's blog

ロード的なことを

NSArray + Map + Block

MacOSX 10.6 以上ないしは、iOS4.0 以上(3.0以上?)でしかできないけど、NSArray に map関数の実装。
NSArrayのドキュメント見ても意外となかったので、即興で書いてみた。

テストあんまりしてないから自信ない。




NSArray+Map.h

//
//  NSArray+Map.h
//  kisa
//
//  Created by 安井 惇 on 10/11/28.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef NSObject* (^NSArrayMap)(NSObject*);
@interface NSArray (Map)
- (NSArray*) map:(NSArrayMap)mapblock;
@end


NSArray+Map.m

//
//  NSArray+Map.m
//  kisa
//
//  Created by 安井 惇 on 10/11/28.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import "NSArray+Map.h"


@implementation NSArray (Map)
- (NSArray*) map:(NSArrayMap)mapblock
{
    NSMutableArray* arr = [[NSMutableArray alloc] initWithCapacity:[self count]];
    NSArray* result = nil;
    
    for (NSObject* obj in self)
    {
        [arr addObject:mapblock(obj)];
    }
    
    result = [NSArray arrayWithArray:arr];
    [arr release];
    return result;
}
@end


使用例

// arr = [ {'first': 'test', 'last': 'abc'}, {'first': 'hoge', 'last': 'huge'}, {'first': 'panda', 'last': 'kopanda'} ];
NSArray* huge = [arr map:^(NSObject*obj){
  return (NSObject*)[(NSDictionary*)obj objectForKey:@"first"];
}];
// huge = ['test', 'hoge', 'panda'];


参考:http://d.hatena.ne.jp/trashsuite/20100414/1271252150