Comment créer des méthodes d’argument variable dans Objective-C

Peut-être que ce sera évidemment simple pour la plupart d’entre vous, mais pourriez-vous donner un exemple de la façon de créer des méthodes similaires (en objective-C) et des fonctions en C pour créer des fonctions comme ssortingngWithFormat: ou NSLog()

Juste pour rappel:

 [NSSsortingng ssortingngWithFormat:@"example tekst %i %@ %.2f",122,@"sth",3.1415"]; NSLog(@"account ID %i email %@",accountID,email); 

J’aimerais créer une méthode similaire à la méthode NSSsortingng ssortingngWithFormat: NSURL - urlWithFormat .

Merci d’avance.

Ce que l’on appelle généralement, ce sont les “fonctions variadiques” (ou les méthodes, pour ainsi dire).

Pour créer cela, il suffit de mettre fin à la méthode avec, comme dans

 - (void)logMessage:(NSSsortingng *)message, ...; 

À ce stade, vous souhaiterez probablement l’emballer dans une fonction de type printf , car l’implémentation de l’un de ceux-ci est au mieux de l’essai.

 - (void)logMessage:(NSSsortingng *)format, ... { va_list args; va_start(args, format); NSLogv(format, args); va_end(args); } 

Notez l’utilisation de NSLogv et non de NSLog ; considérez NSLog(NSSsortingng *, ...); vs NSLogv(NSSsortingng *, va_list); , ou si vous voulez une chaîne; initWithFormat:arguments: sur NSSsortingng * .


Si, par contre, vous ne travaillez pas avec des chaînes, mais plutôt quelque chose comme

 + (NSArray *)arrayWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION; 

les choses deviennent beaucoup plus faciles.

Dans ce cas, au lieu d’une fonction de style vprintf , utilisez une boucle passant par args , en supposant que vous vous identifiez, et parsingz-les comme vous le feriez dans n’importe quelle boucle.

 - (void)logMessage:(NSSsortingng *)format, ... { va_list args; va_start(args, format); id arg = nil; while ((arg = va_arg(args,id))) { /// Do your thing with arg here } va_end(args); } 

Bien entendu, ce dernier exemple suppose que la liste va_args est terminée à zéro.

Remarque: Pour que cela fonctionne, vous devrez peut- être inclure ; mais si la mémoire sert, cela est inclus dans la connexion avec NSLogv, ce qui signifie qu’il est remplacé par “Foundation.h”, donc aussi par “AppKit.h” et “Cocoa.h”, ainsi que par d’autres. donc cela devrait fonctionner hors de la boîte.

 - (void)methodWithFormat:(NSSsortingng*)format, ... { va_list args; va_start(args,format); //loop, get every next arg by calling va_arg(args,) // eg NSSsortingng *arg=va_arg(args,NSSsortingng*) or int arg=(args,int) va_end(args); } 

Si vous voulez passer les arguments de la variable à ssortingngWithFormat :, utilisez quelque chose comme:

 NSSsortingng *s=[[[NSSsortingng alloc] initWithFormat:format arguments:args] autorelease]; 

Une chose à mentionner ici est que le premier paramètre NSSsortingng est ici sous forme de format et que l’autre est passé dans l’argument variable. droite? Donc, avant d’entrer la boucle for, vous avez un paramètre à gérer.

 - (NSSsortingng *) append:(NSSsortingng *)list, ... { NSMutableSsortingng * res = [NSMutableSsortingng ssortingng]; [res appendSsortingng:list]; va_list args; va_start(args, list); id arg = nil; while(( arg = va_arg(args, id))){ [res appendSsortingng:arg]; } va_end(args); return res; } - (void) test_va_arg { NSSsortingng * t = [self append:@"a", @"b", @"c", nil]; STAssertEqualObjects(@"abc", t, @""); }