2010-04-12 8 views
0

Je suis nouveau à Objective-C, mais j'ai essayé d'utiliser HOM (higher order message) afin de parcourir sur NSArray et d'ajouter une chaîne à chaque élément.HOM avec objectif C

Voici mon code:

void print(NSArray *array) { 
    NSEnumerator *enumerator = [array objectEnumerator]; 
    id obj; 

    while (nil!=(obj = [enumerator nextObject])) { 
     printf("%s\n", [[obj description] cString]); 
    } 
} 


int main(int argc, const char *argv[]) { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

NSArray *names = [[NSArray alloc] init]; 
NSArray *names_concat = [[NSArray alloc] init]; 
names = [NSArray arrayWithObjects:@"John",@"Mary",@"Bob",nil]; 
names_concat = [[names collect] stringByAppendingString: @" Doe"]; 

print(names_concat); 
[pool release]; 
} 

Quel est le problème avec ce code?

Mon compilateur (gcc) dit NSArray ne peut pas répondre à "Collect"

Répondre

1

Parce que la méthode -collect ne fait pas partie de la bibliothèque standard Objective-C!

Vous devez obtenir une bibliothèque et l'ajouter à votre projet pour commencer. Voir an article at CocoaDev. Pour collect, voir ceci blog article. À partir de 10.6, Apple a ajouté quelques méthodes à NSArray qui accepte des blocs (ou en d'autres termes des fermetures). Voir NSArray documentation et chercher les mots block. Par ailleurs, sur un point sans rapport, s'il vous plaît ne pas utiliser la méthodecString. C'est obsolète! Voir NSString documentation. cString est très mauvais concernant l'encodage des caractères. Je sais que vous ne l'utilisez qu'à des fins de débogage, mais je ne veux pas que vous preniez l'habitude d'utiliser des méthodes obsolètes en général, et surtout des méthodes concernant les encodages. OS X est en général un système d'exploitation très sympathique pour de nombreux encodages, mais en tant qu'Asiatique, j'ai vu beaucoup de bons programmes se comporter mal simplement parce que les programmeurs utilisaient cString etc ... Tout fonctionne tant que vous utilisez des méthodes non-obsolètes . Désolé de mettre un commentaire sans rapport: p