On les appelle généralement "fonctions variadiques" (ou méthodes, en quelque sorte).
Pour le créer, il suffit de fin votre déclaration de méthode avec , ...
, comme dans
- (void)logMessage:(NSString *)message, ...;
A ce stade, vous voulez probablement l'envelopper dans un printf
-car l'implémentation d'une de ces fonctions à partir de zéro est, au mieux, difficile.
- (void)logMessage:(NSString *)format, ... {
va_list args;
va_start(args, format);
NSLogv(format, args);
va_end(args);
}
Notez l'utilisation de NSLogv
et non NSLog
; considérer NSLog(NSString *, ...);
vs NSLogv(NSString *, va_list);
ou si vous voulez une chaîne de caractères ; initWithFormat:arguments:
sur NSString *
.
Si, par contre, vous ne travaillez pas avec des chaînes de caractères, mais plutôt avec quelque chose comme
+ (NSArray *)arrayWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION;
les choses deviennent beaucoup plus faciles.
Dans ce cas, au lieu d'un vprintf
-utilisez une boucle passant par args
en assumant l'identité au fur et à mesure, et en les analysant comme vous le feriez dans n'importe quelle boucle.
- (void)logMessage:(NSString *)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);
}
Ce dernier exemple, bien sûr, suppose que la liste va_args est terminée par nil.
Note : Pour que cela fonctionne, vous devez pourrait doivent inclure <stdarg.h>
Mais si ma mémoire est bonne, cela est inclus dans NSLogv, ce qui signifie qu'il est inclus dans "Foundation.h", donc aussi dans "AppKit.h" et "Cocoa.h", ainsi que dans un certain nombre d'autres fichiers ; cela devrait donc fonctionner dès le départ.