Sintaxis del método en Objective C


¿Puede alguien explicarme la sintaxis de esta declaración de método? En esta función, se devuelve el número de filas de un UIPickerView (interfaz de usuario de la máquina tragaperras en el iPhone). Desde mi punto de vista, el Método se llama 'pickerView', y devuelve un NSInteger.

Pasa un puntero a UIPickerView llamado 'pickerView'... primero, ¿por qué el método recibe el mismo nombre que el parámetro?

Luego está el parámetro NSInteger llamado componente que nos dice qué componente somos contando las filas para. La lógica para decidir cuál está en el cuerpo del método.

¿Qué es 'numberOfRowsInComponent? Parece describir el valor que estamos devolviendo, pero está en medio de los parámetros.

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component
{
    if (component == kStateComponent)
        return [self.states count];

    return[self.zips count];
}
Author: epatel, 2009-03-25

4 answers

Los métodos Objective-C están diseñados para ser auto-documentados, y toman prestado de la rica tradición de Smalltalk.

Voy a tratar de explicar lo que tienes aquí, -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component.

  • - (NSInteger)
    Esta primera parte indica que se trata de un método de instancia de Objective C que devuelve un objeto NSInteger. el - (guión) indica que se trata de un método instance, donde un + indicaría que se trata de un método class. El primer valor en paréntesis es el tipo de retorno del método.

  • pickerView:
    Esta parte es parte del nombre del mensaje . El nombre completo del mensaje en este caso es pickerView:numberOfRowsInComponent:. El tiempo de ejecución de Objective-C toma esta información del método y la envía al receptor indicado. En C puro, esto se vería como
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component). Sin embargo, dado que esto es Objective-C, la información adicional se empaqueta en el nombre del mensaje.

  • (UIPickerView*)pickerView
    Esta parte es parte de la entrada. La entrada aquí es de tipo UIPickerView* y tiene un nombre de variable local de pickerView.

  • numberOfRowsInComponent:
    Esta parte es la segunda parte del nombre del mensaje . Como puede ver aquí, los nombres de los mensajes se dividen para ayudar a indicar qué información está pasando al receptor. Por lo tanto, si tuviera que enviar un mensaje a un objeto myObject con las variables foo y bar, escribiría:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    a diferencia de C++ estilo:
    myObject.pickerView(foo, bar);.

  • (NSInteger)component
    Esta es la última parte de la entrada . la entrada aquí es de tipo NSInteger y tiene un nombre de variable local de componente.

 356
Author: locriani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-09 08:14:59

En Objective-C, el nombre de un método se compone de todas las porciones de la declaración que no son argumentos y tipos. Por lo tanto, el nombre de este método sería:

pickerView:numberOfRowsInComponent:

El método sería equivalente a una función de estilo C que se vería de la siguiente manera:

edit: (gracias a Jarret Hardie):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)
 51
Author: e.James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:03

Añadiendo a las respuestas anteriores, me gustaría decir que los métodos Objective-C (o mensajes si lo prefiere) tienen nombres de parámetros externos y internos.

Así que en este caso:

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

NumberOfRowsInComponent es external name, uno que usarías al llamar a este método desde el exterior.

Y componente es el nombre interno del parámetro-nombre que utiliza para referirse al parámetro desde dentro del método.

Espero que eso lo aclare abit.

 26
Author: Karolis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-02 17:26:33

Me parece que las firmas del método Objective-C son más como oraciones. Cada parámetro merece una parte en el nombre del método. Por ejemplo, en C podríamos tener un método (setPersonData) para establecer alguna información sobre person:

void setPersonData( char* name, int age, float height ) {

Y en Objective-C el método sería más descriptivo (setPersonName: andAge: andHeight: ), como

- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {
 20
Author: wilczarz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-11 19:42:13