背景
タイトルにある通り。enumerateObjectsUsingBlockって、なんか気軽じゃない。
filteredArrayUsingPredicate + predicateWithBlockなんて、書いたことも無い。
ほぼ純粋なシンタックスシュガーですが、特にmapは手放せなくなります。
mapについて
返り値がnilの場合には結果から除外されます。これを利用すると、簡単なフィルターとして使用できます。
nilを返す必要がある場合には、[NSNull null]を使用してください。
実装
NSArray用カテゴリ
NSArray+BTKCollection.h
//
// NSArray+BTKCollection.h
// BTKCommons
//
// Created by Tomohisa Ota on 2/28/14.
// Copyright (c) 2014 Tomohisa Ota. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSArray (BTKCollection)
- (void) btk_each:(void (^)(id obj, NSUInteger idx, BOOL *stop))block;
- (NSArray*) btk_map:(id (^)(id obj, NSUInteger idx, BOOL *stop))block;
@end
NSArray+BTKCollection.m
//
// NSArray+BTKCollection.m
// BTKCommons
//
// Created by Tomohisa Ota on 2/28/14.
// Copyright (c) 2014 Tomohisa Ota. All rights reserved.
//
#import "NSArray+BTKCollection.h"
@implementation NSArray (BTKCollection)
- (void) btk_each:(void (^)(id obj, NSUInteger idx, BOOL *stop))block
{
if(block == nil){
return;
}
[self enumerateObjectsUsingBlock:block];
}
- (NSArray*) btk_map:(id (^)(id obj, NSUInteger idx, BOOL *stop))block;
{
if(block == nil){
return nil;
}
NSMutableArray *mArray = [[NSMutableArray alloc]initWithCapacity:self.count];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
id mappedObj = block(obj,idx,stop);
if(mappedObj){
[mArray addObject:mappedObj];
}
}];
return mArray.copy;
}
@end
NSDictionary用カテゴリ
NSDictionary+BTKCollection.h
//
// NSDictionary+BTKCollection.h
// BTKCommons
//
// Created by Tomohisa Ota on 2/28/14.
// Copyright (c) 2014 Tomohisa Ota. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSDictionary (BTKCollection)
- (void) btk_each:(void (^)(id key, id obj, BOOL *stop))block;
@end
NSDictionary+BTKCollection.m
//
// NSDictionary+BTKCollection.m
// BTKCommons
//
// Created by Tomohisa Ota on 2/28/14.
// Copyright (c) 2014 Tomohisa Ota. All rights reserved.
//
#import "NSDictionary+BTKCollection.h"
@implementation NSDictionary (BTKCollection)
- (void) btk_each:(void (^)(id key, id obj, BOOL *stop))block
{
if(block == nil){
return;
}
[self enumerateKeysAndObjectsUsingBlock:block];
}
@end