Сравнение строки с массивом в target-C - PullRequest
5 голосов
/ 18 июня 2009

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

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

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

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

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"];

Ответы [ 3 ]

12 голосов
/ 18 июня 2009

Ваш код работает нормально. Это ужасный код, но он работает нормально, // секция ничего не вызывается для любого совпадения, а секция // что-то вызывается для каждого несоответствия в массиве. Я подозреваю, что проблема в том, что вы ожидаете, что // раздел ничего не будет выполнен один раз, если нет совпадений, и // раздел что-то будет выполнен один раз, если есть какое-либо совпадение, что не так. Вы, вероятно, хотите:

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

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
    }
}
7 голосов
/ 18 июня 2009

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

NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];
if (![alphaArray containsObject:aString]) {
    // do something
}
7 голосов
/ 18 июня 2009

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

if ([ALPHA_ARRAY containsObject:aString]) 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...