2011-11-15 92 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演示了其他發佈的答案。