2009-06-18 2 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 снова (кроме констант), пока у вас не будет гораздо более глубокое понимание того, что вы делаете. В этом случае, вы можете создать массив, как описано taebot:

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

Далее, если вы разрабатываете для современной платформы (10.5 или iPhone), вы можете использовать Fast Enumeration, который намного проще и понятнее читать:

-(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, чтобы увидеть, что вы можете сделать бесплатно, а затем вы найдете такие методы, как containsObject что KiwiBastard указывал, и вы можете переписать процедуру as:

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

Спасибо, Питер.Хотя полезный ответ уже дал Киви Бастард, ваша основательность на самом деле научила меня больше, чем я просил. В моей защите: Альфа-массив Я вроде импровизировал, чтобы сделать этот пример понятным. В моем реальном коде я просто использую существующий массив. – Sjakelien

7

Я не знаю, почему ваш код выше не работает, но вы пробовали:

if ([ALPHA_ARRAY containsObject:aString]) 

которая возвращает YES, если aString существует иначе NO

+0

Большое вам спасибо. Это был «containsObject», который я не знал о существовании. Я рассмотрю остальную часть моего кода, чтобы избавиться от множества громоздких «за» циклов! – Sjakelien

+0

также, если это вас интересует, оно сравнивает равенство строк (isEqualToString), а не сравнение указателей. См. Http://stackoverflow.com/questions/5811121/check-if-nsstring-instance-is-contained-in-an-nsarray – Soulfire

6

#define выглядит странно для меня. Я думаю, что каждый раз, когда вы используете ALPHA_ARRAY, будет создан другой экземпляр NSArray. Было бы более чистым использовать метод containsObject: on NSArray:

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