Quelqu'un peut-il expliquer cette syntaxe de déclaration de méthode pour moi? Dans cette fonction, le nombre de lignes d'un UIPickerView (interface utilisateur de machine à sous sur l'iPhone) est renvoyé. De ma compréhension, la méthode s'appelle 'pickerView
' et renvoie un NSInteger.
Il passe un pointeur à la vue UIPickerview appelée 'pickerView
' ... d'abord, pourquoi la méthode s'appelle-t-elle le même nom que le paramètre?
Ensuite, il y a le paramètre NSInteger appelé composant qui nous indique pour quel composant nous comptons les lignes. La logique pour décider qui est dans le corps de la méthode.
Qu'est-ce que 'numberOfRowsInComponent
? Il semble décrire la valeur que nous retournons, mais il se trouve au milieu des paramètres.
- (NSInteger) pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
if (component == kStateComponent)
return [self.states count];
return[self.zips count];
}
Les méthodes Objective-C sont conçues pour être auto-documentées et empruntent à la riche tradition de Smalltalk.
Je vais essayer d'expliquer ce que vous avez ici, -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component
.
- (NSInteger)
Cette première partie indique qu'il s'agit d'une méthode Objective C instance qui renvoie un objet NSInteger. le -
(tiret) indique qu'il s'agit d'une méthode instance, où un +
indiquerait qu'il s'agit d'une méthode class. La première valeur entre parenthèses est le type de retour de la méthode.
pickerView:
Cette partie fait partie du nom du message. Le nom complet du message dans ce cas est pickerView:numberOfRowsInComponent:
. Le moteur d'exécution Objective-C prend cette information de méthode et l'envoie au destinataire indiqué. En C pur, cela ressemblerait àNSInteger pickerView(UIPickerView* pickerView, NSInteger component)
. Cependant, puisqu'il s'agit d'Objective-C, des informations supplémentaires sont regroupées dans le nom du message.
(UIPickerView*)pickerView
Cette partie fait partie de la entrée. L'entrée ici est de type UIPickerView*
Et porte un nom de variable local, pickerView.
numberOfRowsInComponent:
Cette partie est la deuxième partie du nom du message. Comme vous pouvez le voir ici, les noms de message sont divisés pour aider à indiquer les informations que vous transmettez au destinataire. Ainsi, si je devais envoyer un message à un objet myObject avec les variables foo et bar, je taperais:[myObject pickerView:foo numberOfRowsInComponent:bar];
par opposition au style C++:myObject.pickerView(foo, bar);
.
(NSInteger)component
Ceci est la dernière partie de entrée. l'entrée ici est de type NSInteger
et a un nom de variable local de composant.
En Objective-C, le nom d'une méthode est composé de toutes les parties de la déclaration qui ne sont ni des arguments ni des types. Le nom de cette méthode serait donc:
pickerView:numberOfRowsInComponent:
La méthode serait équivalente à une fonction de style C qui se présente comme suit:
modifier: (avec merci à Jarret Hardie ):
NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)
Ajoutant aux réponses précédentes, je voudrais juste dire que les méthodes Objective-C (ou les messages si vous préférez) ont les noms external et internal.
Donc dans ce cas:
- (NSInteger) pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
numberOfRowsInComponent
est le nom externe, celui que vous utiliseriez pour appeler cette méthode de l'extérieur.
Et component
est le nom interne du paramètre, celui que vous utilisez pour faire référence au paramètre depuis l'intérieur de la méthode.
J'espère que ça clarifie un peu.
Il me semble que les signatures de la méthode Objective-C ressemblent davantage à des phrases. Chaque paramètre mérite une partie dans le nom de la méthode. Par exemple, en C, nous pourrions avoir une méthode (setPersonData) pour définir des informations sur la personne:
void setPersonData( char* name, int age, float height ) {
et en Objective-C, la méthode serait plus descriptive (setPersonName: andAge: andHeight:), comme
- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {