Sintaxis del método en Objective-C
¿Alguien puede explicarme la sintaxis de declaración de este método? En esta función, se devuelve el número de filas de 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 UIPickerview llamado ' pickerView
'... primero, ¿por qué el método se llama con el mismo nombre que el parámetro?
Luego 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 devolvemos, 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];
}
Los métodos Objective-C están diseñados para autodocumentarse y toman prestado de la rica tradición de Smalltalk.
Intentaré explicarte 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 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 parte del nombre del mensaje . El nombre completo del mensaje en este caso espickerView: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, 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 . La entrada aquí es de tipoUIPickerView*
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 le está pasando al receptor. Por lo tanto, si enviara un mensaje a un objeto myObject con las variables foo y bar, escribiría:
[myObject pickerView:foo numberOfRowsInComponent:bar];
en lugar del estilo C++:
myObject.pickerView(foo, bar);
.(NSInteger)component
Esta es la última parte de la entrada . la entrada aquí es de tipoNSInteger
y tiene un nombre de variable local de componente.
En Objective-C, el nombre de un método se compone de todas las partes de la declaración que no son argumentos ni tipos. Por 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 tendría el siguiente aspecto:
editar: (con agradecimiento a Jarret Hardie ):
NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)
Agregando a las respuestas anteriores, solo 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
numberOfRowsInComponent
es el nombre externo , el que usarías al llamar a este método desde afuera.
Y component
es el nombre interno del parámetro, el que usas para referirte al parámetro desde dentro del método.
Espero que eso lo aclare un poco.
Me parece que las firmas de los métodos Objective-C se parecen más a 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 cierta 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 {