Quelqu'un peut-il m'indiquer des ressources sur la comparaison insensible à la casse dans l'objectif C? Il ne semble pas avoir de méthode équivalente pourstr1.equalsIgnoreCase(str2)
Quelqu'un peut-il m'indiquer des ressources sur la comparaison insensible à la casse dans l'objectif C? Il ne semble pas avoir de méthode équivalente pourstr1.equalsIgnoreCase(str2)
Réponses:
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
La documentation se trouve dans les méthodes de recherche et de comparaison
NSString
laquelle renvoie un booléen. Ensuite, si la chaîne de réception est nil
, la méthode dans son ensemble retourne NO
.
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
Remarque: stringA &&
est obligatoire car quand stringA
est nil
:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
et ainsi se produit 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.
if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
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 étant que vous évitez le problème potentiel décrit par matm concernant la comparaison de chaînes nulles. Vous pouvez soit vérifier que la chaîne n'est pas nulle avant de faire l'une des compare:options:
méthodes, soit ê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 n'en faites qu'une ou deux comparaisons).
caseInsensitiveCompare
), utilisez toujours cela.
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
Une nouvelle façon de procéder. iOS 8
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
true
pour "Café" et "É", ce n'est certainement pas une bonne réponse.
Conversion de la réponse de Jason Coco à Swift pour les profondément paresseux :)
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)
ce blog m'a été utile
Sur macOS, vous pouvez simplement utiliser -[NSString isCaseInsensitiveLike:]
ce qui revient BOOL
comme -isEqual:
.
if ([@"Test" isCaseInsensitiveLike: @"test"])
// Success
NSMutableArray *arrSearchData;
NSArray *data=[arrNearByData objectAtIndex:i];
NSString *strValue=[NSString stringWithFormat:@"%@", [data valueForKey:@"restName"]];
NSRange r = [strValue rangeOfString:key options:NSCaseInsensitiveSearch];
if(r.location != NSNotFound)
{
[arrSearchData addObject:data];
}
@"Some String"
est reçu de tout autre appel et se trouve êtrenil
, votreif
donneratrue
l'envoicaseInsensitiveCompare
ànil
est valide et donne lieu à un autrenil
qui, dans notre cas, par rapport àNSOrderedSame
renverratrue
(NSOrderedSame
est défini comme 0). Cela peut être une source de bugs assez dévastateurs, comme ce fut le cas dans mon cas. À votre santé!