ここでの答えを使用すると、このメソッドは obj-c での ruby のマップに似たものを実現します。
- (NSArray *)mapObjectsUsingBlock:(id (^)(id obj, NSUInteger idx))block {
NSMutableArray *result = [NSMutableArray arrayWithCapacity:[self count]];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[result addObject:block(obj, idx)];
}];
return result;
}
私の質問は、ブロックの適用中に何か問題が発生した場合、オブジェクトをスキップするにはどうすればよいですか? 通常、列挙子で何かをスキップするには、return
コマンドを使用するだけですが、ブロックが何かを返すことが期待されているため、上記のメソッドではオプションではありません。
この例ではreturn
、スキップするために使用しますが、エラーが発生します。
NSArray *mappedArray = [objArray mapObjectsUsingBlock:^(id obj, NSUInteger i) {
// i don't want this obj to be included in final array
// so I try to skip it
return; // ERROR:incompatible block pointer types sending
// 'void(^)(__strong id, NSUInteger)' to parameter of type
// 'id(^)(__strong id, NSUInteger)'
// else do some processing
return soupedUpObj;
}];
それを回避する私の現在の方法は、単純に null オブジェクトを返し、最終的な配列からそれらを削除することです。しかし、それよりも良い方法があるに違いないと確信しています。