2010-04-01 2 views
0

Je suis en train d'écrire l'équivalent de strchr, mais avec NSStrings ... J'ai actuellement obtenu ceci:strchr dans l'objectif C?

Boolean nsstrchr(NSString* s, char c) 
{ 
    NSString *tmps = [NSString stringWithFormat: @"%c", c]; 
    NSCharacterSet *cSet = [NSCharacterSet characterSetWithCharactersInString: tmps]; 
    NSRange rg = [s rangeOfCharacterFromSet: cSet]; 
    return rg.location != NSNotFound; 
} 

Cela semble inutilement complexe ... Est-il possible de le faire (de préférence, celui qui n'implique pas de transformer le NSString en un cstring qui double le temps d'exécution, ou en l'écrivant moi-même en utilisant characterAtIndex: ... Ai-je manqué une méthode évidente dans la description NSString?

+5

'-rangeOfString:'. – kennytm

Répondre

2

KennyTM a déjà noté (dans un commentaire) que vous pouvez utiliser -[NSString rangeOfString:] au lieu de -[NSString rangeOfCharacterFromSet]. Je ne veux pas voler sa réponse utile, mais je voulais vous signaler que vous pouvez envelopper cela dans une catégorie sur NSString pour le rendre plus facile à utiliser:

@interface NSString (AdditionalStringOps) 
- (BOOL) containsCharacter:(char) c; 
@end 

@implementation NSString (AdditionalStringOps) 

- (BOOL) containsCharacter:(char) c 
{ 
    NSString *tmp = [NSString stringWithFormat:@"%c", c]; 
    return [self rangeOfString:tmp].location != NSNotFound; 
} 

@end 

Et puis vous pouvez l'utiliser comme si :

if ([myString containsCharacter:'A']) { 
    // Do stuff... 
} 
+0

@OP: Notez également l'utilisation de 'BOOL' au lieu de' Boolean' pour Objective-C (soz, pedantics). – Wevah

0

Comme @KennyTM mentionné, utilisez rangeOfString: Si vous avez vraiment affaire à des choses au niveau char, vous pouvez retirer le char* via -UTF8String (ou -cStringUsingEncoding:), puis recherchez votre personnage là-bas comme vous le feriez sur tout autre char* (probablement en utilisant strchr).

0
Boolean nsstrchr(NSString* s, char c) 
{ 
    NSString *tmps = [NSString stringWithFormat: @"%c", c]; 
    NSRange rg = [s rangeOfString: tmps]; 
    return rg.location != NSNotFound; 
} 
0

Plusieurs simplifications.

  1. Utilisez [s rangeOfString:tmps] pour éliminer le jeu de caractères.
  2. Le jeu de caractères peut être créé avec [NSCharacterSet characterSetWithRange:NSMakeRange(c, 1)], de sorte que vous n'avez pas besoin de créer tmps
  3. strchr([s UTF8String], c) - en supposant c est un caractère ASCII, et le pointeur de retour ne sera pas échapper à la fonction (il y a un risque que le pointeur devient pendante).