Comparaison de chaînes en Objective-C

92

J'ai actuellement un serveur Web configuré que je communique via SOAP avec mon application iPhone. Je renvoie une chaîne contenant un GUID et lorsque j'essaie de comparer cela avec une autre chaîne, j'obtiens des résultats étranges.

Pourquoi cela ne se déclencherait-il pas? Sûrement les deux chaînes sont un match?

NSString *myString = @"hello world";

if(myString == @"hello world")
    return;
ingh.am
la source
1
Cette question est désormais pratiquement inutile car la capture d'écran a disparu. C'est pourquoi le code doit être copié dans les questions.
jscs
La capture d'écran était l'erreur je pense, mais la réponse a été donnée comme il y a 2 ans!
ingh.am
1
Mais aucun futur lecteur ne peut voir l'erreur ou le code que vous utilisiez pour savoir si c'est le même que le leur, ce qui signifie que cette question ne peut aider personne d'autre.
jscs
Je chercherai l'image. Je comprends que c'est comme une base de référence pour d'autres questions, mais la fermer maintenant est juste un peu inutile.
ingh.am
2
Pourquoi cette question est-elle close? C'est une question parfaitement valable!
ibz

Réponses:

214

Utilisez la -isEqualToString:méthode pour comparer la valeur de deux chaînes. L'utilisation de l' ==opérateur C comparera simplement les adresses des objets.

if ([category isEqualToString:@"Some String"])
{
    // Do stuff...
}
jlehr
la source
2
Ah! Je vous remercie beaucoup. Sentez-vous comme un imbécile sur celui-ci!
ingh.am
3
Je suppose que dans ObjectiveC ++, vous pouvez créer une surcharge d'opérateurs pour vous donner une capacité syntaxiquement sucrée à utiliser == mais aucun programmeur C objectif sensé ne le ferait, car == n'est utilisé que pour les contrôles d'identité dans les objets C objectif.
Warren P
48

Vous pouvez utiliser une comparaison sensible à la casse ou insensible à la casse, en fonction de vos besoins. La sensibilité à la casse est comme ceci:

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

Insensible à la casse est comme ceci:

if ([category compare:@"Some String" options:NSCaseInsensitiveSearch] == NSOrderedSame)
{
   // Both strings are equal with respect to their case.
}
mxg
la source
1
Je pense que cela devrait être: ([category compare: @ "Some String" options: NSCaseInsensitiveSearch] == NSOrderedSame)
JaakL
9
Soyez prudent avec la fonction "compare" car si la chaîne (dans ce cas "category") est nulle, comparer renverra toujours NSOrderedSame.
nh32rg
C'est un excellent point @ nh32rg !! +1 pour ça! IsEqualToString a-t-il le même problème?
badweasel
5

Vous pouvez comparer la chaîne avec les fonctions ci-dessous.

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
la source