Quelle serait la meilleure méthode pour comparer un NSString à un tas d'autres chaînes insensible à la casse? Si c'est l'une des chaînes alors la méthode devrait retourner YES, sinon NO.Insensible à la casse par rapport au groupe de chaînes
Répondre
Voici une petite fonction d'aide:
BOOL isContainedIn(NSArray* bunchOfStrings, NSString* stringToCheck)
{
for (NSString* string in bunchOfStrings) {
if ([string caseInsensitiveCompare:stringToCheck] == NSOrderedSame)
return YES;
}
return NO;
}
Bien sûr, cela pourrait être considérablement optimisé pour différents cas d'utilisation.
Si, par exemple, vous faites beaucoup de contrôles contre un bunchOfStrings constant vous pouvez utiliser un NSSet
pour contenir les versions minuscules des cordes et utilisez containsObject:
:
BOOL isContainedIn(NSSet* bunchOfLowercaseStrings, NSString* stringToCheck)
{
return [bunchOfLowercaseStrings containsObject:[stringToCheck lowercaseString]];
}
Juste pour ajouter quelques ajouts la réponse de Nikolai:
NSOrderedSame
est définie comme 0
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
donc, si vous appelez caseInsensitiveCompare:
sur un objet nil
vous obtiendriez nil
. Alors vous comparez nil
avec NSOrderSame
(qui est 0) vous obtiendriez un match qui bien sûr est faux.
Vous devrez également vérifier si le paramètre passé à caseInsensitiveCompare:
ne doit pas être nul. À partir du documentation:
Cette valeur ne doit pas être nulle. Si cette valeur est nulle, le comportement est indéfini et peut changer dans les futures versions de Mac OS X.
vous remercie. Je cherchais particulièrement quelque chose comme caseInsensitiveCompare: –