Comparação de strings em Objective-C

92

Atualmente, tenho um servidor web configurado que comunico por SOAP com meu aplicativo para iPhone. Estou retornando uma string contendo um GUID e quando tento comparar isso com outra string, obtenho alguns resultados estranhos.

Por que isso não dispararia? Certamente as duas cordas são uma correspondência?

NSString *myString = @"hello world";

if(myString == @"hello world")
    return;
ingh.am
fonte
1
Esta pergunta agora é praticamente inútil porque a captura de tela desapareceu. É por isso que o código deve ser copiado e colado nas perguntas.
jscs
A captura de tela foi o erro, eu acho, mas a resposta foi dada há 2 anos!
ingh.am
1
Mas nenhum leitor futuro pode ver o erro ou o código que você estava usando para saber se é o mesmo que o deles, o que significa que esta pergunta não pode ajudar mais ninguém.
jscs
Vou procurar a imagem. Eu entendo que isso é como uma base de referência para outras questões, mas fechá-lo agora é um pouco inútil.
ingh.am
2
Por que esta questão está fechada? É uma pergunta perfeitamente válida!
ibz

Respostas:

213

Use o -isEqualToString:método para comparar o valor de duas strings. Usar o ==operador C irá simplesmente comparar os endereços dos objetos.

if ([category isEqualToString:@"Some String"])
{
    // Do stuff...
}
Jlehr
fonte
2
AH! Muito obrigado. Sinta-se um pouco idiota nisso!
ingh.am
3
Meu palpite é que em ObjectiveC ++ você poderia criar uma sobrecarga de operador para fornecer a capacidade sintaticamente açucarada de usar ==, mas nenhum programador C objetivo lógico faria isso, porque == só é usado para verificações de identidade em objetos C objetivo.
Warren P
48

Você pode usar a comparação com ou sem distinção de maiúsculas e minúsculas, dependendo do que você precisa. A distinção entre maiúsculas e minúsculas é assim:

if ([category isEqualToString:@"Some String"])
{
   // Both strings are equal without respect to their case.
}

Não diferencia maiúsculas de minúsculas é assim:

if ([category compare:@"Some String" options:NSCaseInsensitiveSearch] == NSOrderedSame)
{
   // Both strings are equal with respect to their case.
}
mxg
fonte
1
Eu acho que deveria ser: ([categoria compare: @ "Some String" options: NSCaseInsensitiveSearch] == NSOrderedSame)
JaakL
9
Tenha cuidado com a função "compare" porque se a string (neste caso "categoria") for nula, compare sempre retornará NSOrderedSame.
nh32rg
Esse é um ótimo ponto @ nh32rg !! 1 para isso! O isEqualToString tem o mesmo problema?
badweasel
5

Você pode comparar a string com as funções abaixo.

NSString *first = @"abc";
NSString *second = @"abc";
NSString *third = [[NSString alloc] initWithString:@"abc"];
NSLog(@"%d", (second == third))  
NSLog(@"%d", (first == second)); 
NSLog(@"%d", [first isEqualToString:second]); 
NSLog(@"%d", [first isEqualToString:third]); 

Output will be :-
    0
    1
    1
    1
Vikram Pote
fonte