web-dev-qa-db-fra.com

Syntaxe de la méthode dans Objective C

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];
}
176
Craig

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.

356
locriani

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)
52
e.James

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.

28
Karolis

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 {
21
wilczarz