7

NSInteger配列を頻繁に使用するため、integerAtIndex:、arrayByAddingInteger:などのメソッドを追加するNSArrayのカテゴリ(およびNSMutableArrayのカテゴリも)を作成しました。これらのメソッドは、NSNumberオブジェクトのNSIntegerのラップ/アンラップを処理します。

私が疑問に思っているのは、NSIntegerで高速な列挙を実行できるように、カテゴリを拡張する方法があるかどうかです。私は書くことができるようになりたいです:

NSArray* arrayOfIntegers;
    .
    .
    .

for(NSInteger nextInteger in arrayOfIntegers)
    {
    }

…。「nextInteger」が舞台裏でNSNumberオブジェクトから引き出されるようにします。これはできますか?

4

3 に答える 3

4

NSFastEnumerationを使用してこれを行うクリーンな方法があるとは思えません。これは、メソッドに大きく依存しているnextObjectためです。

ただし、ブロックメソッドを追加することで、別の方法でそれを行うことができます。

@interface NSArray (Integers)
-(void)eachInteger:(void(^)(NSInteger))block;
@end

@implementation NSArray (Integers)
-(void)eachInteger:(void(^)(NSInteger))block {
  for (NSNumber *num in self) {
    block(num.integerValue);
  }
}
@end

そうすれば、同様の方法でコードで使用できます。

NSArray *arr = [NSArray arrayWithObjects:[NSNumber numberWithInt:23],
                                         [NSNumber numberWithInt:42],
                                         nil];
...
[arr eachInteger:^(NSInteger i) {
  NSLog(@"The int is %i", i);
}];
// =>
//    The int is 23
//    The int is 42

たまたま私が書いたLumumbaFrameworkのNSArrayカテゴリを見てみたいと思うかもしれません:D

于 2012-06-05T18:28:02.427 に答える
3

これを正確に行うことはできませんが、NSNumberをNSIntegerに簡単に変換して、後で使用することができます。そのためのマクロを書くことさえできます:

#define int_enum(var, arr, block) \
    for(NSNumber *__tmp in arr) { NSInteger var = [__tmp integerValue]; block }

次のように使用します。

NSArray *array = // whatever;
int_enum(counter, array, {
    // things you want to do with `counter' as an NSInteger
});
于 2012-06-05T18:24:44.987 に答える
0

あなたが本当にブロックが好きなら、これを試してみてください:

@interface NSArray(blockIteration)

@property (copy, nonatomic, readonly) void (^forEachObject)(void (^block)(NSArray *, id));
@property (copy, nonatomic, readonly) void (^forEachInt)(void (^block)(NSArray *, int));
@property (copy, nonatomic, readonly) void (^forEachDouble)(void (^block)(NSArray *, double));

@end

@implementation NSArray(blockIteration)

-(void (^)(void (^)(NSArray *, id))) forEachObject
{
    return [^(void (^block)(NSArray *, id)) {
        block = [block copy];
        for (id obj in self)
        {
            block(self, obj);
        }
    } copy];
}

-(void (^)(void (^)(NSArray *, int))) forEachInt
{
    return [^(void (^block)(NSArray *, int)) {
        block = [block copy];
        for (NSNumber *num in self)
        {
            block(self, [num intValue]);
        }
    } copy];
}

-(void (^)(void (^)(NSArray *, double))) forEachDouble
{
    return [^(void (^block)(NSArray *, double)) {
        block = [block copy];
        for (NSNumber *num in self)
        {
            block(self, [num doubleValue]);
        }
    } copy];
}


@end

int main()
{
    NSArray *array = [NSArray arrayWithObjects:@"Hello", @"World", @"This", @"Is", @"A", @"Test", nil];

    array.forEachObject(^(id arr, id obj) {
        NSLog(@"%@", obj);
    });
}

この実装はARCに依存していることに注意してください。

于 2012-06-05T18:48:30.360 に答える