2011-03-10 14 views
7

HeeObjetivo c implementar un método que toma la matriz de argumentos

¿Alguien sabe cómo implementar un método en el objetivo c, que tendrá una serie de argumentos como parámetros tales como:

[NSArray arrayWithObjects:@"A",@"B",nil]; 

La declaración de método para este método es:

+ (id)arrayWithObjects:(id)firstObj... 

No puedo hacer ese método yo solo. Hice lo siguiente:

+ (void) doSometing:(id)string manyTimes:(NSInteger)numberOfTimes; 

[SomeClass doSometing:@"A",@"B",nil manyTimes:2]; 

Se dará a la warningtoo muchos argumentos para la función 'doSometing: manytimes:'

Gracias mientras tanto.

Respuesta

12

Los puntos suspensivos (...) se hereda de C; puede usarlo solo como el argumento final en una llamada (y ha perdido la coma relevante en su ejemplo). Así, en su caso, usted probablemente querrá:

+ (void)doSomethingToObjects:(id)firstObject, ...; 

o, si desea que el recuento sea explícita y puede pensar en una forma de expresarlo así:

+ (void)doManyTimes:(NSInteger)numberOfTimes somethingToObjects:(id)firstObject, ...; 

A continuación, puede utilizar la métodos normales de C para tratar con elipses, que residen en stdarg.h. Hay una documentación rápida de los here, ejemplo de uso sería:

+ (void)doSomethingToObjects:(id)firstObject, ... 
{ 
    id object; 
    va_list argumentList; 

    va_start(argumentList, firstObject); 
    object = firstObject; 

    while(1) 
    { 
     if(!object) break; // we're using 'nil' as a list terminator 

     [self doSomethingToObject:object]; 
     object = va_arg(argumentList, id); 
    } 

    va_end(argumentList); 
} 

EDIT: adiciones, en respuesta a los comentarios. No puede pasar varias cosas entregadas en una elipsis a otra función que toma puntos suspensivos debido a la forma en que C maneja la función de invocación (que es heredada por Objective-C, aunque obviamente no). En cambio, tiendes a pasar la va_list. P.ej.

+ (NSString *)doThis:(SEL)selector makeStringOfThat:(NSString *)format, ... 
{ 
    // do this 
    [self performSelector:selector]; 

    // make string of that... 

    // get the argument list 
    va_list argumentList; 
    va_start(argumentList, format); 

    // pass it verbatim to a suitable method provided by NSString 
    NSString *string = [[NSString alloc] initWithFormat:format arguments:argumentList]; 

    // clean up 
    va_end(argumentList); 

    // and return, as per the synthetic example 
    return [string autorelease]; 
} 
+0

¿Hay también una manera de tomar puntos suspensivos como parámetro y luego pasar a otro método? –

+1

@Mats: normalmente obtiene la va_list y la pasa (por lo tanto, vprintf, o NSString -initWithFormat: arguments :). No se puede simplemente pasar lo que se describe por las elipsis (como en, hacer que una función de puntos suspensivos llame a otra), ya que el tiempo de ejecución de C no es necesario para saber cuánto material hay y, por lo tanto, no puede copiarlo. – Tommy

+0

¿Puedes dar un ejemplo de código al pasar una elipsis a un segundo método objetivo-c? –

3

Varios argumentos (también conocidos como arglist) solo pueden aparecer al final de una declaración de método. Su método doSomething sería algo como esto:

+ (void)doNumberOfTimes:(NSInteger)numberOfTimes withStrings:(id)firstArg, ... 
{ 
    va_list args; 
    va_start(args, firstArg); 

    NSString * argString = firstArg; 
    while (argString != nil) 
    { 
     // do something with argString here 

     argString = va_arg(args, NSString *); 
    } 

    va_end(args); 
} 

a ser llamado de la siguiente manera:

[SomeClass doNumberOfTimes:2 withStrings:@"A", @"B", nil]; 

Ver también: How to create variable argument methods in Objective-C

Cuestiones relacionadas