177 votes

Syntaxe des méthodes en Objective-C

Quelqu'un peut-il m'expliquer cette syntaxe de déclaration de méthode ? Dans cette fonction, on renvoie le nombre de lignes d'un UIPickerView (interface utilisateur de machine à sous sur l'iPhone). D'après ce que je comprends, la méthode s'appelle ' pickerView ', et renvoie un NSInteger.

Elle transmet un pointeur vers la vue UIPickerview appelée ' pickerView ... d'abord, pourquoi la méthode appelée porte le même nom que le paramètre ?

Ensuite, il y a un paramètre NSInteger appelé component qui nous indique pour quel composant nous comptons les rangs. La logique pour décider lequel se trouve dans le corps de la méthode.

Qu'est-ce que c'est ? numberOfRowsInComponent ? Il semble décrire la valeur que nous renvoyons, 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];
}

359voto

locri Points 3632

Les méthodes Objective-C sont conçues pour être auto-documentées, et elles 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'un programme Objective C instance qui renvoie un objet NSInteger. la méthode - (tiret) indique qu'il s'agit d'un instance où un + indiquerait qu'il s'agit d'une classe méthode. La première valeur entre parenthèses est le type de retour de la méthode.

  • pickerView:
    Cette partie fait partie de la nom du message . Le site nom complet du message dans ce cas, c'est pickerView:numberOfRowsInComponent: . Le runtime Objective-C prend ces informations de méthode et les envoie au récepteur indiqué. En C pur, cela ressemblerait à
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component) . Toutefois, comme il s'agit d'Objective-C, des informations supplémentaires sont intégré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 a un nom de variable locale de pickerView.

  • numberOfRowsInComponent:
    Cette partie est la deuxième partie de la nom du message . Comme vous pouvez le voir ici, les noms des messages sont divisés pour aider à indiquer quelles informations vous transmettez au récepteur. 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
    C'est la dernière partie de la entrée . l'entrée ici est de type NSInteger et a un nom de variable locale de composant.

19 votes

+1 pour une excellente réponse. Je suggérerais de remplacer "factory" par "class" dans votre premier point, puisque le "+" indique officiellement une méthode de classe. Il se trouve que de nombreuses méthodes "+" sont des méthodes d'usine, mais ce n'est pas la bonne définition.

2 votes

Merci ! Une question supplémentaire : Si vous envoyez un message à un objet myObject avec les variables foo et bar comme vous l'avez montré : [myObject pickerView:foo numberOfRowsInComponent:bar] ; Est-ce que pickerView fait référence au nom de la méthode ou au paramètre ?

2 votes

Ni l'un ni l'autre. Il est de bon ton de faire référence à la fois au nom de la méthode ET au paramètre, mais le nom complet de la méthode est en fait pickerView:numberOfRowsInComponent :. Si vous essayez d'invoquer pickerView :, vous recevrez une erreur d'exécution, car la méthode n'existe pas.

54voto

e.James Points 51680

En Objective-C, le nom d'une méthode est composé de toutes les parties de la déclaration qui ne sont pas des arguments et 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ésenterait comme suit :

éditer : (avec des remerciements à Jarret Hardie ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

1 votes

+1 - belle description courte. Parfois, je trouve que l'ampoule s'allume pour les gens si vous écrivez l'équivalent en style C comme "NSInteger pickerViewNumberOfRowsInCompoent(UIPickerView *pickerView, NSInteger component)

0 votes

J'aime votre explication, réécrire en C est bien mieux.

32voto

Karolis Points 556

En complément des réponses précédentes, je voudrais juste dire que les méthodes Objective-C (ou les messages si vous préférez) ont externe y interne les noms des paramètres.

Donc dans ce cas :

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

numberOfRowsInComponent est le externe le nom que vous utiliserez lorsque vous appellerez cette méthode depuis l'extérieur.

Et component est le interne nom du paramètre, celui que vous utilisez pour faire référence au paramètre à l'intérieur de la méthode.

J'espère que cela clarifie un peu les choses.

21voto

wilczarz Points 208

Il me semble que les signatures de méthodes Objective-C ressemblent davantage à des phrases. Chaque paramètre mérite une place dans le nom de la méthode. Par exemple, en C, on pourrait avoir une méthode ( setPersonData ) pour définir certaines informations sur la personne :

void setPersonData( char* name, int age, float height ) {

et en Objective-C la méthode serait plus descriptive ( setPersonName:etAge:etHeure : ), comme

- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {

8 votes

Et pourquoi setPersonalData(char* andName, int alsoAge, float alsoHeight) n'aurait-il pas de sens ? Tout dépend de ce que vous comprenez de la syntaxe, et non de l'intention des concepteurs d'objc d'être intelligents ici. Ils ont juste ajouté un tas de syntaxe supplémentaire qui n'a franchement aucun sens :)

5 votes

Vous avez mal compris la réponse, je le crains. setPersonalData(char* andName, int alsoAge, float alsoHeight) est une signature, pas une invocation. L'invocation de cette fonction serait setPersonData( "Tom", 25, 175 ) - et cela ne veut pas dire grand chose, n'est-ce pas ? L'invocation Obj-C ressemblerait à ceci : [person setPersonName : @"Tom" andAge : 25 andHeight : 175] ;

3 votes

Maintenant que j'y pense, ma réponse est plus une plainte qu'une déclaration. Je ne pourrais pas être plus d'accord.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X