Comparando Cordas no cocoa

Eu tentei:

- (NSString*) generateString { NSString* stringToReturn = @"thisString"; return stringToReturn; } - (void) otherMethod { NSString *returnedString = [self generateString]; if (returnedString == @"thisString") { // Do this } else if (returnedString == @"thatString") { // Do that } } 

Que nunca combina.

Eu tentei então

 if ([returnedString compare:@"thisString"] == 1) 

Mas o método compare sempre retorna 1 para mim, mesmo quando comparado com uma string diferente.

Qual é a maneira correta de fazer isso e qual resultado devo esperar?

Primeiro de tudo, você está usando o operador == para comparar dois pointers de object (do tipo NSString * ). Então, isso retorna true quando os pointers são os mesmos, não quando as strings têm o mesmo conteúdo. Se você quiser comparar se duas strings são iguais, use isEqualToString: ou isEqual: ( isEqual: é mais geral, pois funciona para todos os tipos de objects).

Segundo, compare: retorna 0 ( NSOrderSame ) quando eles são iguais e 1 ( NSOrderedDescending ) quando o primeiro é maior que o segundo. Então, na verdade, ele retorna 1 somente quando eles são diferentes (especificamente, quando o primeiro é maior que o segundo).

 [returnedString isEqualToString: @"thisString"] 

Ao comparar duas cadeias idênticas, a compare retornará NSOrderedSame , que é 0. Ela também pode retornar NSOrderedAscending , -1 e NSOrderedDescending , 1.

Você pode preferir usar isEqualToString que retorna YES ou NO.

 if ([returnedString isEqualToString:@"thisString"]) NSLog(@"Equal"); else NSLog(@"Not Equal"); 

O operador == quando aplicado a objects verifica se os pointers são iguais.

Você precisa usar o método -compare ou um de seus complementares – compare:options:compare:options:range: ou -compare:options:range:locale: que retorna um NSComparisonResult ( NSOrderAscending , NSOrderSame , NSOrderDescending )

Se você só precisa de comparação de igualdade, você pode usar -isEqualToString: que retorna um valor BOOL .