Вопрос по objective-c, string, arrays, comparison – Сравнение строки с массивом в target-C

5

Вот очень простой вопрос, на который, я уверен, вы сможете быстро ответить. Пожалуйста, не смейтесь над моим невежеством.

У меня есть строка, которую я хочу сравнить с массивом строк. Только если строка не является частью массива, я хочу выполнить операцию. Я попробовал следующий код, который не работает. Я понимаю, почему, но я просто не могу придумать, как сделать это правильно.

Пожалуйста, помогите мне избавиться от моих страданий.

заранее спасибо

Sjakelien

<code>-(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"];
</code>
Не могли бы вы добавить, почему это не работает? Brian Ramsay

Ваш Ответ

3   ответа
7

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

NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];
if (![alphaArray containsObject:aString]) {
    // do something
}
Это самый чистый подход, мне интересно, почему за них меньше голосов "за".
7

if ([ALPHA_ARRAY containsObject:aString]) 

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

Огромное спасибо. Это был "containsObject" что я не знал о существовании. Я рассмотрю остальную часть своего кода, чтобы избавиться от множества громоздких «для». петля! Sjakelien
также, если это вас интересует, это работает, сравнивая строки & apos; равенство (isEqualToString) в отличие от сравнения указателей. Увидетьstackoverflow.com/questions/5811121/…
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
    }
}

Кроме того, вы явно не понимаете макросы и когда вы должны и не должны их использовать (как правило, вы никогда не должны использовать их, за очень немногими исключениями). Макрос в тексте подставляется в ваш код. Это означает, что создание и инициализация массива происходитevery time Вы используете ALPHA_ARRAY. Это ужасно.

По сути, никогда не используйте #define снова (за исключением констант), пока не получите более глубокое понимание того, что вы делаете. В этом случае вы должны создать массив, как описано ниже:

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

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

-(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, и вы можете переписать свою подпрограмму следующим образом:

-(void) findRedundant: (NSString *) aString {
    NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];
    if ( [alphaArray containsObject: aString] ) {
        // do found
    } else {
        // do not found
    }
}
Спасибо, Питер. Хотя полезный ответ уже дал KiwiBastard, ваша тщательность на самом деле научила меня больше, чем я просил. В мою защиту: Alpha Array, я вроде как импровизировал, чтобы сделать этот пример понятным. В моем реальном коде я просто использую существующий массив. Sjakelien

Похожие вопросы