2009-06-15 9 views
2

J'ai un NSString que je dois examiner le caractère par caractère et:Objectif C NSString problème

examine char 
    perform calculation 
loop (until string ends) 

Toute réflexion sur la meilleure façon de le faire? Ai-je besoin de convertir le NSString en une chaîne NSArray ou C?

Répondre

6

La façon la plus simple d'aller à ce sujet est en utilisant la méthode NSString « s characterAtIndex::

int charIndex; 
for (charIndex = 0; charIndex < [myString length]; charIndex++) 
{ 
    unichar testChar = [myString characterAtIndex:charIndex]; 
    //... your code here 
} 
+0

Merci! Cela fait l'affaire. – Alan

4

-characterAtIndex: est l'approche plus simple, mais le mieux est de descendre à CFString et utiliser un CFStringInlineBuffer, comme dans cette méthode:

- (NSIndexSet *) indicesOfCharactersInSet: (NSCharacterSet *) charset 
{ 
    if (self.length == 0) 
    return (nil); 

    NSMutableIndexSet * set = [NSMutableIndexSet indexSet]; 

    CFIndex i = 0; 
    UniChar character = 0; 
    CFStringInlineBuffer buf; 
    CFStringInitInlineBuffer((CFStringRef)self, &buf, CFRangeMake(0, self.length)); 

    while ((character = CFStringGetCharacterFromInlineBuffer(&buf, i)) != 0) 
    { 
     if ([charset characterIsMember: character]) 
      [set addIndex: i]; 

     i++; 
    } 

    return (set); 
} 

C'est meilleur parce qu'il va récupérer un certain nombre de caractères à la fois, aller chercher plus au besoin. C'est effectivement la version de caractères for (id x in y) dans ObjC 2.

+0

Bien que le code soit plus complexe, des points supplémentaires vous permettent de profiter du pont sans frais NSString/CFString! Je pense que votre suggestion est plus économe en espace, alors qu'elle est légèrement plus efficace en temps, en raison de moins d'appels de fonction. Cependant, ce serait une course serrée et la différence est probablement minime. –

+0

Il finit généralement par être plus rapide, car il va déplacer un morceau de données à la fois, qui peuvent tous être placés dans la mémoire cache. La version -characterAtIndex: peut devoir frapper la mémoire principale beaucoup plus souvent. Cela permet également un meilleur déroulement de la boucle et des optimisations de compilateur similaires, car toutes les méthodes sont en ligne, ce qui permet au compilateur d'optimiser en fonction des spécificités des implémentations de la fonction CFStringInlineBuffer. –