objective c - enlazador - Sintaxis del método en el objetivo C
objective c++ (4)
¿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). Desde mi punto de vista, el Método se llama '' pickerView
'' y devuelve un NSInteger.
Pasa en un puntero al 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 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];
}
Agregando a las respuestas anteriores, me gustaría decir que los métodos de 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 un nombre externo , uno que usarías cuando llamas a este método desde afuera.
Y componente es el nombre interno del parámetro - nombre que usa para referirse al parámetro desde el interior del método.
Espero que lo aclare un poco.
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 por lo tanto:
pickerView:numberOfRowsInComponent:
El método sería equivalente a una función de estilo C que se veía de la siguiente manera:
editar: (con agradecimiento a Jarret Hardie ):
NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)
Los métodos 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 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 este es un método de instancia , donde a+
indicaría que este es 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 espickerView: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 parte 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 está pasando al receptor. Por lo tanto, si tuviera que enviar un mensaje a myObject con las variables foo y bar, escribiría:
[myObject pickerView:foo numberOfRowsInComponent:bar];
a diferencia del estilo C ++:
myObject.pickerView(foo, bar);
.(NSInteger)component
Esta es la última porción de la entrada . la entrada aquí es de tipoNSInteger
y tiene un nombre de variable local de componente.
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 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 {