2011-11-15 4 views
1

intのNSArrayを繰り返して、それぞれを特定のintと比較したいと思います。すべてのintはC型intです。次のように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 
    } 
} 

[amounts objectAtIndex:i]の結果にint型amountを比較するときにint型にIDを比較することはできませんので、私はエラーを取得しますが。この場合、IDはなぜ関与していますか? objectAtIndexは指定されたインデックスでオブジェクトを返すだけでいいですか? C intに返されたオブジェクトをキャストして比較することは可能ですか?

NSArrayを使用せずにCでこのタイプの処理を行うだけでいいですか?

答えて

6

intValueへの呼び出しがありません(配列にNSNumberのインスタンスが含まれていると仮定します)。

またそのようにパフォーマンスのためにあなたは、一度だけ[amounts count]を呼び出すために、おそらくたいでしょう:

-(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; 
    NSUInteger amountCount = [amounts count]; 
    for (NSUInteger i = 0; i < amountCount; i++) 
    { 
     if (amount < [[amounts objectAtIndex:i] intValue]); 
     { 
      // do something 
     } 
     // do something 
    } 
} 

そして、ここでは、(システム最適化)の高速列挙にさらに高速のおかげです同時実行へ

そして、以前のものよりもさらに高速です1、感謝:

-(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が互いに依存しないようにする必要があります。

+0

3つの方法でジョブを完了していただきありがとうございます。 –

2

NSArrayはプリミティブ型ではなくオブジェクトを含む配列です。配列にCの整数を入れるためには、通常NSNumberクラスのインスタンスにそれらをラップします。 NSArrayにNSNumberオブジェクトが含まれていれば、@Regexidentは他の投稿された答えを示すので、intValueメソッドを使って簡単にプリミティブ値を取得できます。

関連する問題