2009-03-25 28 views
172

¿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 (interfaz de usuario de máquina tragamonedas en el iPhone). Según tengo entendido, el método se llama 'pickerView' y devuelve un NSInteger.Método de sintaxis en el objetivo C

Pasa en un puntero al UIPickerview llamado 'pickerView' ... primero, ¿por qué el método se llama con el mismo nombre que el parámetro?

A continuación está el 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]; 
} 

Respuesta

352

Los métodos de Objective-C están diseñados para documentarse por sí mismos, y toman prestados de la rica tradición de Smalltalk.

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

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

  • pickerView:
    Esta parte es una parte del nombre mensaje. El nombre completo del mensaje en este caso es pickerView:numberOfRowsInComponent:. El tiempo de ejecución de Objective-C toma esta información de 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 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 de. La entrada aquí es del tipo UIPickerView* y tiene un nombre de variable local de pickerView.

  • numberOfRowsInComponent:
    Esta porción es la segunda parte del nombre 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 de. la entrada aquí es de tipo NSInteger y tiene un nombre de variable local de componente.

+17

+1 para una respuesta excelente Sugeriría cambiar "fábrica" ​​por "clase" en su primer punto, ya que el "+" indica oficialmente un método de clase. Ocurre que muchos métodos "+" son métodos de fábrica, pero esa no es la definición correcta .! –

+1

Gracias una cuestión adicional: Si se va a mensaje de un myObject objeto con el foo las variables y bar como usted mostró: [myObject pickerView: foo numberOfRowsInComponent: bar]; ¿el pickerView se refiere al nombre de método o parámetro? – Craig

+2

Ninguno. Es un buen estilo para referirse tanto al nombre del método como al parámetro, pero el nombre completo del método es realmente pickerView: numberOfRowsInComponent :. Si tratara de invocar pickerView :, recibiría un error de tiempo de ejecución, ya que el método no existiría. – locriani

51

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. Por lo tanto, el nombre de este método sería:

pickerView:numberOfRowsInComponent: 

El método sería equivalente a una función C-estilo que parecía como sigue:

edición: (gracias a Jarret Hardie):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component) 
+1

+1 - Descripción corta agradable. 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) –

+0

me gusta tu explicación, reescribir en C es mucho mejor. – lcc

26

Agregando a las respuestas anteriores, sólo quisiera decir que los métodos de Objective-C (o mensajes, si lo prefiere) tienen externa y nombres de los parámetros internos.

Así que en este caso:

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

numberOfRowsInComponent es externa nombre, uno en que se usan cuando se llama a este método desde el exterior.

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

Espero que lo aclare abit.

+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

+0

Maldición, encuentro esta respuesta tan incorrecta. No hay nada como un nombre externo/interno de parámetros. Es el TYPE y el identificador VARIABLE. Me pregunto por qué todos tratan de definir el ObjC como un lenguaje natural, es tan antinatural en todos sus aspectos. Es un lenguaje, eso es todo, solo aprendamos sin usar palabras sofisticadas a su alrededor. – Siddharth

+0

Los argumentos pueden tener nombres internos/externos. Es verdad. – lcc

20

Me parece que las firmas de 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 que podríamos tener un método (setPersonData) para establecer alguna información acerca de 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 { 
+8

¿Y por qué setPersonalData (char * andName, int también Age, float alsoHeight) no tiene sentido? Es todo acerca de lo que entiendes sobre la sintaxis, nada acerca de la intención de los diseñadores objc ser inteligente aquí. simplemente agregaron un montón de sintaxis que francamente no tenía ningún sentido ... :) – Siddharth

+4

No entendiste bien la respuesta, me temo. setPersonalData (char * andName, int tambiénAge, float tambiénHeight) 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í: [person setPersonName: @ "Tom" and Age: 25 andHeight: 175]; – wilczarz

+2

Ahora que lo pienso, mi respuesta es más una queja que una afirmación. No podría estar mas de acuerdo. – Siddharth