web-dev-qa-db-fra.com

Comparaison insensible à la casse NSString

Quelqu'un peut-il m'indiquer des ressources sur la comparaison sans distinction de casse dans Objective C? Il ne semble pas avoir une méthode équivalente à str1.equalsIgnoreCase(str2)

226
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
  // strings are equal except for possibly case
}

La documentation se trouve à Méthodes de recherche et de comparaison

537
Jason Coco
 NSString *stringA;
 NSString *stringB;

 if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
     // match
 }

Remarque: stringA && est requis car lorsque stringA est nil:

 stringA = nil;
 [stringA caseInsensitiveCompare:stringB] // return 0

et il se trouve que NSOrderedSame est également défini comme 0.

L'exemple suivant est un piège typique:

 NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
 if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
     // what happens if "Rank" is not found in standardUserDefaults
 }
48
ohho

Une alternative si vous voulez plus de contrôle que la simple insensibilité à la casse est:

[someString compare:otherString options:NSCaseInsensitiveSearch];

La recherche numérique et l'insensibilité diacritique sont deux options pratiques.

46
drawnonward

Vous pouvez toujours vous assurer qu'ils sont dans le même cas avant la comparaison:

if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
    // They're equal
}

Le principal avantage est d’éviter le problème potentiel décrit par Matm concernant la comparaison de chaînes nulles. Vous pouvez vérifier que la chaîne n'est pas nulle avant d'utiliser l'une des méthodes compare:options: ou vous pouvez être paresseux (comme moi) et ignorer le coût supplémentaire de création d'une nouvelle chaîne pour chaque comparaison (ce qui est minime si vous ne faites que une ou deux comparaisons).

22
chrysAllwood

Une nouvelle façon de faire cela. iOS 8

let string: NSString = "Café"
let substring: NSString = "É"

string.localizedCaseInsensitiveContainsString(substring) // true
7
iGo
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
7
WhirlWind

Essayez cette méthode 

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
6
Reena

Conversion de la réponse de Jason Coco en Swift pour les personnes profondément paresseuses :) 

if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
  // Strings are equal.
}
6
Tasik

vérifier avec le préfixe comme dans l'iPhone ContactApp 

([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)

this blog m'a été utile

5
iMeMyself

Solution alternative pour Swift:

Pour faire les deux UpperCase:

par exemple:

if ("ABcd".uppercased() == "abcD".uppercased()){
}

ou pour faire les deux LowerCase:

par exemple:

if ("ABcd".lowercased() == "abcD".lowercased()){
}
1
FARAZ

Sur macOS, vous pouvez simplement utiliser -[NSString isCaseInsensitiveLike:], qui renvoie BOOL de la même manière que -isEqual:.

if ([@"Test" isCaseInsensitiveLike: @"test"])
    // Success
0
mangerlahn