由于我经常使用NSInteger数组,我为NSArray编写了一个类别(也是NSMutableArray的一个类别),它添加了诸如integerAtIndex:,arrayByAddingInteger:等方法。这些方法负责在NSNumber对象中包装/解包NSInteger
我想知道的是,是否有一种方法可以增强我的类别,以便我可以对NSIntegers进行快速枚举。我希望能够写下:
NSArray* arrayOfIntegers;
.
.
.
for(NSInteger nextInteger in arrayOfIntegers)
{
}
...。所以“nextInteger”被拉出幕后的NSNumber对象。我可以这样做吗?
答案 0 :(得分:4)
我怀疑使用NSFastEnumeration有一种 clean 方式,因为它很大程度上取决于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
也许你可能想看看NSArray categories上的Lumumba Framework,这恰好是我写的:D
答案 1 :(得分: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
});
答案 2 :(得分: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。