web-dev-qa-db-fra.com

Comment vérifier le dernier caractère d'un NSString

Je veux poser une question sur la 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.

60
Questions
NSString *data = @"abcde,";
if([data hasSuffix:@","]) // This returns true in this example
    // do something
165
robinjam

Le Guide de programmation NSString recommande:

Si vous voulez simplement déterminer si une chaîne contient un modèle 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 faites cela à plusieurs endroits, cela peut être facilement refactorisé en une méthode d'aide.

Voici un lien vers les NSPredicate docs .

Modifier

J'ai fait du profilage et c'est exagéré 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.

5
Abizern

Si vous êtes préoccupé par les performances et que vous souhaitez rechercher un caractère, l'utilisation de la méthode -characterAtIndex: peut être plus rapide. -hasSuffix: prend une chaîne, donc a 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','])
{

}

Bien sûr, vous devez profiler. Gardez à l'esprit cependant qu'en plaçant endsWithCharacter dans une méthode, nous avons ajouté le message qui lui est ajouté, ce qui faussera les résultats du profilage, sauf si vous faites de même 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 très bien avoir de l'importance (dans ce cas, vous voudrez probablement utiliser le code directement dans la boucle, comme passage de message à l'intérieur d'une boucle intérieure serrée n'est pas un excellent plan).

4
Sam Deane