7

因为我经常使用 NSInteger 数组,所以我为 NSArray 编写了一个类别(也为 NSMutableArray 编写了一个类别),它添加了诸如 integerAtIndex:、arrayByAddingInteger: 等方法。这些方法负责将 NSInteger 包装/解包到 NSNumber 对象中。

我想知道是否有一种方法可以增强我的类别,以便我可以在 NSIntegers 上进行快速枚举。我希望能够写:

NSArray* arrayOfIntegers;
    .
    .
    .

for(NSInteger nextInteger in arrayOfIntegers)
    {
    }

....so that "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

也许你可能想看看Lumumba 框架上的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 回答