2012-06-05 14 views
7

NSInteger dizilerini sık kullandığım için tamsayıAtIndex :, arrayByAddingInteger :, vb. Gibi yöntemleri ekleyen NSArray (ve NSMutableArray için de bir tane) için bir kategori yazdım./NSInteger öğesinin bir NSNumber nesnesinde açılması.NSIntegers için NSArray kategorisinde Hızlı Numaralandırma

Neleri merak ettiğim, NSInteger'larda hızlı numaralandırma yapabilmem için kategorimi geliştirmenin bir yolu olup olmadığıdır. Ben yazabilmek için istiyorum:

NSArray* arrayOfIntegers; 
    . 
    . 
    . 

for(NSInteger nextInteger in arrayOfIntegers) 
    { 
    } 

... "nextInteger" perde arkasında NSNumber nesnenin çekilmesini .so. Bunu yapabilir miyim?

cevap

4

o ağır nextObject bağlıdır gibi ben NSFastEnumeration ile bunu yapmanın bir temiz yol olduğunu şüphe yöntem. Eğer başka bir şekilde yapabileceğini

Fakat, bunun için bir blok yöntemi ekleyerek:

@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 

Bu şekilde, benzer şekilde kodunuza kullanabilirsiniz:

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 

Belki benim tarafımdan yazılacak olur Lumumba Framework üzerinde NSArray categories bir göz, atmak isteyebilirsiniz: D

+1

Pedantic: "NSIntger" öğesini döndürüyorsanız, '-integerValue' kullanılmalıdır. – Wevah

+0

oops, JavaScript ile karıştırılmış olmalı. Kodu güncellendi. İpucu için teşekkürler :) – Tharabas

+0

Haklısınız: çok temiz değil. Ama yine de, benim tercih ettiğim çözüm. Teşekkürler. –

3

Bu tam olarak yapılamaz, ancak NSNumber öğenizi kolayca bir NSInteger haline dönüştürebilir ve daha sonra kullanabilirsiniz. Hatta bunun için bir makro yazabilirsiniz:

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

hoşuna kullanın:

NSArray *array = // whatever; 
int_enum(counter, array, { 
    // things you want to do with `counter' as an NSInteger 
}); 
0

gerçekten bloklar gibi, bu bir denerseniz:

@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); 
    }); 
} 

Bu uygulamanın ARC bağımlı olduğunu unutmayın.