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)
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
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
}
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.
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).
Une nouvelle façon de faire cela. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Essayez cette méthode
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
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.
}
vérifier avec le préfixe comme dans l'iPhone ContactApp
([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)
this blog m'a été utile
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()){
}
Sur macOS, vous pouvez simplement utiliser -[NSString isCaseInsensitiveLike:]
, qui renvoie BOOL
de la même manière que -isEqual:
.
if ([@"Test" isCaseInsensitiveLike: @"test"])
// Success