¿Cómo paso múltiples parámetros en Objective-C?

178

He leído varias de las publicaciones sobre la sintaxis del método Objective-C, pero supongo que no entiendo varios nombres para un método.

Estoy tratando de crear un método llamado getBusStopscon NSStringy NSTimeIntervalparámetros y un tipo de retorno de NSMutableArray. Así es como he construido el método, pero obviamente obtiene errores en tiempo de ejecución:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

Vi otro ejemplo con un método:

-(NSInteger)pickerView:(UIPickerView *)pickerView
            numberOfRowsInComponent:(NSInteger)component

No entiendo por qué este método tiene un nombre de método para cada parámetro. ¿Debo hacer lo mismo con algo como:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval
Atma
fuente

Respuestas:

120

Objective-C no tiene parámetros con nombre, por lo que todo en el lado izquierdo de los dos puntos es parte del nombre del método. Por ejemplo,

getBusStops: forTime:

es el nombre del método El nombre está dividido para que pueda ser más descriptivo. Simplemente podrías nombrar tu método

getBusStops: :

pero eso no te dice mucho sobre el segundo parámetro.

Terry Wilcox
fuente
157

Debe delimitar cada nombre de parámetro con un ":" como mínimo. Técnicamente, el nombre es opcional, pero se recomienda para facilitar la lectura. Entonces podrías escribir:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

o lo que sugeriste:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
EM
fuente
15
+1: Los argumentos de la función Objective-C son de hecho posicionales, no nombrados, por lo que la etiqueta es opcional y para consumo humano.
Jarret Hardie
no estoy seguro de por qué se prefiere "forTime" en la firma, "timeInterval" se puede usar como el segundo parámetro en la función, ¿verdad?
galactica
@galactica - Claro, el nombre puede ser lo que tenga más sentido para ti. Este ejemplo utiliza la terminología del OP para mayor coherencia.
EM
2
¿Todavía no está seguro de para qué se forTimeutiliza?
mrgloom
71

Si; la sintaxis del método Objective-C es así por un par de razones; uno de estos es para que quede claro cuáles son los parámetros que está especificando. Por ejemplo, si está agregando un objeto a un NSMutableArrayíndice determinado, lo haría utilizando el método:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

Se llama a este método insertObject:atIndex:y está claro que se está insertando un objeto en un índice específico.

En la práctica, agregar una cadena "¡Hola, mundo!" en el índice 5 de un NSMutableArrayllamado arrayse llamaría de la siguiente manera:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

Esto también reduce la ambigüedad entre el orden de los parámetros del método, asegurando que pase el parámetro del objeto primero, luego el parámetro del índice. Esto se vuelve más útil cuando se utilizan funciones que toman una gran cantidad de argumentos y reduce el error al pasar los argumentos.

Además, la convención de nomenclatura del método es tal porque Objective-C no admite sobrecarga; sin embargo, si desea escribir un método que haga el mismo trabajo, pero tome diferentes tipos de datos, esto se puede lograr; tomar, por ejemplo, la NSNumberclase; esto tiene varios métodos de creación de objetos, que incluyen:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

En un lenguaje como C ++, simplemente sobrecargaría el método numérico para permitir que se pasen diferentes tipos de datos como argumento; sin embargo, en Objective-C, esta sintaxis permite implementar varias variantes diferentes de la misma función, cambiando el nombre del método para cada variante de la función.

Alex Rozanski
fuente
¿son necesarios los nombres de los parámetros durante la llamada al método (envío de mensajes) si el nombre de la función incluye los nombres de los parámetros?
Naveen
24

El texto antes de cada parámetro es parte del nombre del método. A partir de su ejemplo, el nombre del método es en realidad

-getBusStops:forTime:

Cada uno: representa un argumento. En una llamada a método, el nombre del método se divide en: sy los argumentos aparecen después de: seg

[getBusStops: arg1 forTime: arg2]
sigjuice
fuente
3
Creo que olvidó agregar el nombre del método.
Özgür
11

para crear método:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

para llamar al método:

[mymethods:self.contoCorrente withsecond:self.asecond];
VITROXMAN
fuente
-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

yo:

(returnTypeOfSecontArgument) secondArgumentName ;

como en otros idiomas, utilizamos la siguiente sintaxis vacía, add(int one, int second) pero la forma de asignar argumentos OBJ_ces diferente como se describió anteriormente

Chaudhry Umair
fuente