Método de sintaxis en Objective-C

176

¿Alguien puede explicarme esta sintaxis de declaración de método? En esta función, se devuelve el número de filas de un UIPickerView (UI de máquina tragamonedas en el iPhone). Según tengo entendido, el Método se llama ' pickerView' y devuelve un NSInteger.

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

Luego hay un parámetro NSInteger llamado componente que nos dice para qué componente estamos contando las filas. 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 el medio de los parámetros.

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

    return[self.zips count];
}
Craig
fuente

Respuestas:

358

Los métodos de Objective-C están diseñados para auto documentarse, y se basan en la rica tradición de Smalltalk.

Trataré de explicar lo que tienes aquí -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component,.

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

  • pickerView:
    Esta parte es una 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 la información de este método y la envía al receptor indicado. En C puro, esto se vería así
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component). Sin embargo, como se trata de Objective-C, se incluye información adicional en el nombre del mensaje.

  • (UIPickerView*)pickerView
    Esta porción 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 fuera a mensaje de un myObject objeto con el foo las variables y bar, me TIPO:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    a diferencia de estilo C ++:
    myObject.pickerView(foo, bar);.

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

locriani
fuente
18
+1 para una gran respuesta. Sugeriría cambiar "fábrica" ​​a "clase" en su primer punto, ya que "+" indica oficialmente un método de clase. Sucede que muchos métodos "+" son métodos de fábrica, pero esa no es la definición adecuada.
e.James
2
¡Gracias! Una pregunta adicional: si tuviera que enviar un mensaje a un objeto myObject con las variables foo y bar como mostró: [myObject pickerView: foo numberOfRowsInComponent: bar]; ¿PickerView se refiere al nombre o parámetro del método?
Craig
2
Ninguno. Es un buen estilo que se refiera tanto al nombre del método como al parámetro, pero el nombre completo del método es realmente pickerView: numberOfRowsInComponent :. Si intentara invocar pickerView :, recibiría un error de tiempo de ejecución, ya que el método no existiría.
locriani
1
Permítanme aclarar sobre eso: el pickerView: parte por sí misma DEBE referirse al siguiente parámetro, para seguir un buen estilo de codificación. Sin embargo, es solo la mitad del nombre del método. Un mejor ejemplo puede ser [myObject setX: foo Y: bar], donde el método es setX: Y :.
locriani
1
Sé que esta respuesta es antigua, pero he estado viviendo en un mundo .NET durante los últimos años. Soy nuevo en Objective C y estoy en transición de un mundo web a la industria móvil. Me gustaría agradecerle por una explicación tan bien documentada que es tan relevante para la pregunta. +1
d3v1lman1337
52

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

pickerView:numberOfRowsInComponent:

El método sería equivalente a una función de estilo C que tuviera el siguiente aspecto:

editar: (con agradecimiento a Jarret Hardie ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)
e.James
fuente
1
+1 - buena descripción corta. A veces encuentro que la bombilla se enciende para las personas si escribes el equivalente al estilo C como "NSInteger pickerViewNumberOfRowsInCompoent (UIPickerView * pickerView, componente NSInteger)
Jarret Hardie
Me gusta tu explicación, reescribir en C es mucho mejor.
lcc
30

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

Entonces en este caso:

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

numberOfRowsInComponentes el nombre externo , el que usaría al llamar a este método desde el exterior.

Y componentes el nombre interno del parámetro, el que usa para referirse al parámetro desde el interior del método.

Espero que eso lo aclare un poco.

Karolis
fuente
1
De acuerdo con su descripción, el nombre del método podría considerarse como el nombre externo del primer parámetro. Esto también encaja con el comentario de wilczarz a continuación.
Jake
Maldición, encuentro esta respuesta tan incorrecta. No hay nada como un nombre externo / interno de parámetros. Es el tipo y el identificador VARIABLE. Me pregunto por qué todos intentan definir el ObjC como un lenguaje natural, es tan antinatural en todas sus formas. Es un lenguaje, eso es, vamos a aprenderlo sin usar palabras elegantes a su alrededor.
Siddharth
Los argumentos pueden tener nombres internos / externos. Es verdad.
lcc 21/07
21

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 configurar alguna información sobre la persona:

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 {
wilczarz
fuente
8
¿Y por qué setPersonalData (char * andName, int alsoAge, float alsoHeight) no tiene sentido? Se trata de lo que entiendes sobre la sintaxis, nada sobre la intención de los diseñadores de objc de ser inteligentes aquí. acaban de agregar un montón de más sintaxis que francamente no tenía ningún sentido ... :)
Siddharth
55
No entendiste la respuesta, me temo. setPersonalData (char * andName, int alsoAge, float alsoHeight) es una firma, no una invocación. La invocación de esta función sería setPersonData ("Tom", 25, 175), y eso no dice mucho, ¿verdad? La invocación de Obj-C se vería así: [persona setPersonName: @ "Tom" y Edad: 25 y Altura: 175];
wilczarz
3
Ahora que lo pienso, mi respuesta es más una queja que una declaración. No podría estar mas de acuerdo.
Siddharth