2009-06-18 22 views
4

ここには非常に基本的な質問があります。私はあなたがすぐに答えることができると確信しています。私の無知を笑わないでください。文字列を目的のCの配列と比較する

私は文字列を持っています。これは文字列の配列と比較したいものです。文字列が配列の一部でない場合にのみ、私は操作を実行したい。私は、次のコードを試して、それは動作しません。私はなぜそれを理解するのですか、それを正しく行う方法は考えられません。

私の不幸から私を助けてください。事前に

おかげ

Sjakelien

-(void) findRedundant: (NSString *) aString { 
#define ALPHA_ARRAY [NSArray arrayWithObjects: @"A", @"B", @"C", nil] 
    NSUInteger f; 
    for (f = 0; f < [ALPHA_ARRAY count]; f++) 
    { 
     NSString * stringFromArray = [ALPHA_ARRAY objectAtIndex:f]; 
     if ([aString isEqualToString:stringFromArray]) { 
      // do nothing 

     } else { 
      //do something 
     } 

    } 

} 



[self findRedundant:@"D"]; 
+1

質問に問題がない理由を追加できますか? –

答えて

12

コードが正常に動作しているようです。そのひどいコードですが、うまくいきます。//何もしないセクションは任意のマッチで呼び出され、//何かのセクションが配列の各不一致に対して呼び出されます。私は問題は、一致するものがない場合は一度だけ実行される//何もしないセクションを期待しているということですが、一致した場合には一度だけ実行されるセクションを実行します。

-(void) findRedundant: (NSString *) aString { 
#define ALPHA_ARRAY [NSArray arrayWithObjects: @"A", @"B", @"C", nil] 
    BOOL found = NO; 
    NSUInteger f; 
    for (f = 0; f < [ALPHA_ARRAY count]; f++) { 
     NSString * stringFromArray = [ALPHA_ARRAY objectAtIndex:f]; 
     if ([aString isEqualToString:stringFromArray]) { 
      found = YES; 
      break; 
     } 
    } 
    if (found) { 
     // do found 
    } else { 
     // do not found 
    } 
} 

また、あなたが明確にマクロを理解していない、あなたは、それらを使用すべきでないとき(一般的に、あなたは非常に少数の例外を除いて、それらを使用することはありません):あなたはおそらくしたいです。マクロは、コードにテキストで置き換えられます。つまり、配列の作成と初期化は、のALPHA_ARRAYを使用するたびにになります。これはひどい。

基本的に、あなたが何をしているのかをはるかに深く理解するまで、決して#defineを再度使用しないでください(定数を除く)。あなたが読みする方がはるかに簡単かつ明確である近代的なプラットフォーム(10.5またはiPhone)、あなたが使用することができ、高速列挙のために開発している場合は、

NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil]; 

次へ:この場合、あなたはtaebotが説明するように、配列を作成します。

-(void) findRedundant: (NSString *) aString { 
    NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil]; 
    BOOL found = NO; 
    for (NSString* stringFromArray in alphaArray) { 
     if ([aString isEqualToString:stringFromArray]) { 
      found = YES; 
      break; 
     } 
    } 
    if (found) { 
     // do found 
    } else { 
     // do not found 
    } 
} 

そして最後に、あなたは自由のために何ができるかを見るためにNSArrayとNSStringの上のドキュメントを読んで行く必要があり、その後、あなたはKiwiBastardが指摘していることcontainsObjectのような方法を見つけることができます、そしてあなたがあなたのルーチンを書き換えることができますとして:

-(void) findRedundant: (NSString *) aString { 
    NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil]; 
    if ([alphaArray containsObject: aString]) { 
     // do found 
    } else { 
     // do not found 
    } 
} 
+0

Peterに感謝します。役に立つ答えはすでにKiwiBastardによって与えられていましたが、私が求めていた以上にあなたの徹底が実際に教えてくれました。 私の防衛では:アルファアレイ私はこの例を理解できるように即興しています。私の実際のコードでは、私はちょうど既存の配列を使用します。 – Sjakelien

7

上記のコードが動作しない理由を私はわからないんだけど、あなたは試してみました:

場合はYESを返します
if ([ALPHA_ARRAY containsObject:aString]) 

をそうでなければaStringが存在するNO

+0

ありがとうございます。私がその存在を知らなかったのは "containsObject"でした。私は、コードの残りの部分を見直して、厄介な 'for'ループを取り除きます。 – Sjakelien

+0

もしあなたが興味があれば、ポインタを比較するのではなく、文字列の等価性(isEqualToString)を比較して動作します。 http://stackoverflow.com/questions/5811121/check-if-nsstring-instance-is-contained-in-an-nsarray – Soulfire

6

#defineは私にとって奇妙に見えます。 ALPHA_ARRAYを使うたびに、別のNSArrayインスタンスが作成されると思います。 NSArrayでcontainsObject:メソッドを使用する方がクリーンです。

NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil]; 
if (![alphaArray containsObject:aString]) { 
    // do something 
} 
関連する問題