2010-07-14 4 views

Répondre

162
NSString *data = @"abcde,"; 
if([data hasSuffix:@","]) // This returns true in this example 
    // do something 
+0

robinjam, merci pour votre réponse. Je l'essaie, mais ça n'a pas marché. Est-ce une autre méthode? – Questions

+1

Ça marche pour moi ... Vous devez avoir un bug ailleurs. – robinjam

+0

robinjam, merci pour votre réponse. Et j'essaie un autre NSString *, ça marche aussi. Je suppose que c'est quelques autres problèmes de mon programme. Étant donné que NSString * est passé à partir d'un autre objet, puis-je afficher le dernier caractère de la chaîne NSString, car je veux confirmer que le dernier caractère. Je vous remercie. – Questions

5

Le NSString Programming Guide recommande:

Si vous voulez simplement déterminer si une chaîne contient un motif donné, vous pouvez utiliser un prédicat:

Ainsi, 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 à remonter? Peut-être, mais si vous faites cela à plus d'un endroit, il peut être facilement refactorisé en une méthode d'aide. Voici un lien vers le NSPredicate docs.

Modifier

J'ai fait quelques profilage et il 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.

+6

Woah! Predicate évaluation juste pour vérifier le suffixe d'une chaîne? C'est un peu exagéré. – dreamlax

+0

Pourquoi est-ce exagéré? '-hasSuffix:' est juste une méthode pratique pour configurer une recherche sur NSString. Juste parce qu'il est plus court à écrire ne le rend pas plus efficace.C'est aussi une recommandation des docs (comme je l'ai lié à) et cela donne aussi au questionneur une autre option pour tester son code car l'approche '-hasSuffix:' ne fonctionne pas, et introduit une nouvelle approche de recherche de chaîne que le questionneur et d'autres n'ont peut-être pas déjà envisagé. – Abizern

+1

Il est excessif parce que vous devez créer un objet prédicat, qui doit analyser la chaîne de format de prédicat, et vous devez également évaluer l'objet prédicat avec l'objet cible. 'hasSuffix:' doit seulement s'assurer que les derniers caractères du receveur sont égaux à l'argument. Cela ne me surprendrait pas si le prédicat 'endswith' utilisait' hasSuffix: 'en interne. En outre, le code fourni pour 'hasSuffix:' dans l'autre réponse fonctionne. S'il ne travaille pas pour le PO, il ne nous a pas donné suffisamment d'informations pour répondre correctement à sa question. – dreamlax

4

Si vous vous inquiétez des performances et que vous souhaitez vérifier un caractère, l'utilisation de la méthode -characterAtIndex: peut ê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 profil, bien sûr, pour être sûr. Gardez à l'esprit cependant qu'en mettant endsWithCharacter dans une méthode, nous avons ajouté le message qui y est passé, ce qui faussera les résultats du profilage à moins que vous ne fassiez de même lors du profilage des alternatives. Tout ceci 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 être important (dans ce cas, vous voudrez probablement utiliser le code directement dans la boucle , car le passage d'un message à l'intérieur d'une boucle interne serrée n'est pas un bon plan).

+0

'- [NSString characterAtIndex:]' renvoie un 'unichar', pas un' char'. –

+0

Bon point Jonathan - J'ai mis à jour l'exemple en conséquence ... –

Questions connexes