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
NSStringlaquelle 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 stringAest nil:
stringA = nil;
[stringA caseInsensitiveCompare:stringB] // return 0
et ainsi se produit NSOrderedSameest é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
truepour "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 BOOLcomme -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, votreifdonneratruel'envoicaseInsensitiveCompareànilest valide et donne lieu à un autrenilqui, dans notre cas, par rapport àNSOrderedSamerenverratrue(NSOrderedSameest défini comme 0). Cela peut être une source de bugs assez dévastateurs, comme ce fut le cas dans mon cas. À votre santé!