web-dev-qa-db-fra.com

comment passer des arguments variables à une autre méthode?

j'ai googlé et ai appris à savoir comment utiliser les arguments variables. mais je veux passer mes arguments variables à une autre méthode. Je reçois des erreurs. comment faire ça ?

-(void) aMethod:(NSString *) a, ... {
  [self anotherMethod:a]; 
  // i m doing this but getting error. how to pass complete vararg to anotherMethod
}
38
g.revolution

AFAIK ObjectiveC (comme C et C++) ne vous fournit pas une syntaxe qui permette ce que vous avez directement en tête.

La solution de contournement habituelle consiste à créer deux versions d'une fonction. Une qui peut être appelée directement en utilisant ... et une autre appelée par d’autres fonctions en passant les paramètres sous la forme d’une liste va.

 .. 
 [obj aMethod: @ "teste ce paramètre% d", 1337); 
 [obj une autre méthode: @ "teste ce paramètre% d", 666); 
 .. 
 
 - (void) aMéthode: (NSString *) a, ... 
 {
 va_list ap; 
 va_start (ap, a); 
 
 [moi-même un autreMéthode: a avecParamètres: ap]; 
 
 va_end (ap); 
} 
 
 - (vide) une autreMethode: (NSString *) a, ... 
 {
 va_list ap; 
 va_start (ap, a); 
 
 [soi un autreMéthode: a avecParamètres: ap]; 
 
 va_end (ap); 
} 
 
 - (void) une autreMethode: (NSString *) a withParameters: (va_list) valist 
 {
 NSLog ([[[NSString alloc] initWithFormat: un arguments: valist] autorelease]); 
} 
51
Till

Vous ne pouvez pas passer directement d'arguments variadiques. Mais certaines de ces méthodes offrent une alternative qui vous permet de passer un argument va_list, par exemple.

#include <stdarg.h>

-(void)printFormat:(NSString*)format, ... {
   // Won't work:
   //   NSString* str = [NSString stringWithFormat:format];

   va_list vl;
   va_start(vl, format);
   NSString* str = [[[NSString alloc] initWithFormat:format arguments:vl] autorelease];
   va_end(vl);

   printf("%s", [str UTF8String]);
}
20
kennytm

Avez-vous envisagé de configurer vos arguments dans un tableau ou un dictionnaire et de coder de manière conditionnelle?

-(void) aMethodWithArguments:(NSArray *)arguments {
    for (id *object in arguments) {
        if ([object isKindOfClass:fooClass]) {
            //handler for objects that are foo
            [self anotherMethod:object];
        }
        if ([object isKindOfClass:barClass]) {
            //and so on...
            [self yetAnotherMethod:object];
        }
    }
}
1
Justin

Je pense que vous pourriez utiliser des macros pour obtenir la même chose. Disons que vous voulez passer les arguments variables d'unMéthod à un autre

-(void) aMethod:(NSString *) a, ... {
}

Vous pouvez définir votre autre 'méthode' en utilisant une macro, bien que ce ne soit pas une vraie méthode:

#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__]

Ceci est ma solution.

0
Bruce Chen