2011-11-15 56 views
1

我想遍历整个NSArray的ints,并将每一个与特定的int进行比较。所有整数都是C型整数。使用NSArray进行C型int比较

我使用的代码如下:

-(int)ladderCalc: (NSArray*)amounts: (int)amount 
{ 
    int result; 

    for (NSUInteger i=0; i< [amounts count]; i++) 
    { 
     if (amount < [amounts objectAtIndex:i]); 
     { 
      // do something 
     } 
     // do something 
    } 
} 

但是我整型amount比较的[amounts objectAtIndex:i]结果时,因为你不能比较ID为int得到一个错误。为什么参与这个案件的身份证?不应该objectAtIndex只是在指定的索引返回对象?是否有可能将对象转换回C int然后进行比较?

或者我应该只是放弃NSArray,并在C中做这种类型的事情?

回答

6

你错过了在那里调用intValue(假设你的数组包含NSNumber的实例,这是假设公平的)。

也为性能考虑,你可能会想打电话[amounts count]只有一次,就像这样:

-(int)ladderCalc:(NSArray *)amounts:(int)amount 
{ 
    int result; 
    NSUInteger amountCount = [amounts count]; 
    for (NSUInteger i = 0; i < amountCount; i++) 
    { 
     if (amount < [[amounts objectAtIndex:i] intValue]); 
     { 
      // do something 
     } 
     // do something 
    } 
} 

这里还有更快的感谢(系统优化)快速列举:

-(int)ladderCalc:(NSArray *)amounts:(int)amount 
{ 
    int result; 
    for (NSNumber *amount in amounts) { 
     if (amount < [amount intValue]) { 
      // do something 
     } 
     // do something 
    } 
} 

,另一种是速度甚至比以前的一个,由于并发执行:

-(int)ladderCalc:(NSArray *)amounts:(int)amount 
{ 
    int result; 
    [amounts enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSNumber *amount, NSUInteger idx, BOOL *stop) { 
     if (amount < [amount intValue]) { 
      // do something 
     } 
     // do something 
    }]; 
} 

谨慎的提示:由于并发性,最后一个版本要求您的// do something s不相互依赖。

+0

感谢您提供完成工作的所有3种方法! –

2

NSArray是一个包含对象而非原始类型的数组。为了将C整数放入数组中,通常会将它们包装在NSNumber类的实例中。然后,NSArray将包含NSNumber对象,从中您可以使用intValue方法轻松获取原始值,因为@Regexident演示了其他发布的答案。