Comment vérifier le dernier caractère D'un NSString
Je veux poser une question sur le NSString * dans l'objectif C. Puis-je vérifier le dernier caractère d'un objet NSString*?
Exemple:
NSString* data = @"abcde,";
if(data is end with ',') // I don't know this part
// do sth
, Merci beaucoup.
3 réponses
NSString *data = @"abcde,";
if([data hasSuffix:@","]) // This returns true in this example
// do something
Le Guide de programmation NSString recommande:
Si vous voulez simplement déterminer si une chaîne contient un motif donné, vous pouvez utiliser un prédicat:
Donc, dans votre exemple:
NSString *data = @"abcde,";
// Create the predicate
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"SELF endswith %@", @","];
// Run the predicate
// match == YES if the predicate is successful
BOOL match = [myPredicate evaluateWithObject:data];
// Do what you want
if (match) {
// do something
}
Un peu long à écrire? Peut-être, mais si vous le faites à plus d'un endroit, il peut être facilement refactorisé dans une méthode d'aide.
Voici un lien vers les documents NSPredicate .
Modifier
J'ai fait du profilage et c'est overkill dans ce cas simple (voir mon commentaire ci-dessous). Je vais laisser la réponse ici de toute façon juste comme un exemple d'utilisation de prédicats pour ce genre de chose.
Si vous êtes inquiet pour les performances, et que vous voulez vérifier un caractère, en utilisant-characterAtIndex: méthode peut bien être plus rapide. - hasSuffix: prend une chaîne, donc potentiellement besoin de faire plus de travail que de simplement vérifier un seul caractère (bien que la différence puisse être triviale).
Vous pouvez également utiliser des catégories pour ajouter une méthode à NSString comme ceci:
@interface NSString(StringUtilities)
- (BOOL) endsWithCharacter: (unichar) c;
@end
@implementation NSString(StringUtilities)
- (BOOL) endsWithCharacter: (unichar) c
{
NSUInteger length = [self length];
return (length > 0) && ([self characterAtIndex: length - 1] == c);
}
@end
// test it...
NSString *data = @"abcd,";
if ([data endsWithCharacter: L','])
{
}
Vous devez profiler, bien sûr, pour être sûr. Gardez à l'esprit cependant qu'en mettant endsWithCharacter dans une méthode que nous avons ajoutée le message qui lui passe en tête, ce qui biaisera les résultats du profilage à moins que vous ne fassiez la même chose lors du profilage des alternatives.
Tout cela est probablement une optimisation prématurée pour la plupart des cas-mais bien sûr, si vous faites ce test des milliers de fois par seconde, cela peut avoir de l'importance (dans ce cas, vous voudriez probablement utiliser le code directement dans la boucle, car le passage d'un message dans une boucle interne serrée n'est pas un bon plan).