Sintassi del metodo nell’objective C

Qualcuno può spiegare questa syntax di dichiarazione del metodo per me? In questa funzione, viene restituito il numero di righe di UIPickerView (interfaccia utente slot machine sull’iPhone). Da quanto ho capito, il metodo è chiamato ‘ pickerView ‘ e restituisce un NSInteger.

Passa in un puntatore a UIPickerview chiamato ‘ pickerView ‘ … prima, perché il metodo ha lo stesso nome del parametro?

Poi c’è il parametro NSInteger chiamato componente che ci dice su quale componente stiamo contando le righe. La logica per decidere quale è nel corpo del metodo.

Che cos’è ‘ numberOfRowsInComponent ? Sembra descrivere il valore che stiamo restituendo, ma è nel mezzo dei parametri.

 - (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (component == kStateComponent) return [self.states count]; return[self.zips count]; } 

I metodi Objective-C sono progettati per auto-documentarsi e prendono a prestito dalla ricca tradizione di Smalltalk.

Cercherò di spiegare cosa avete qui, -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component .

  • - (NSInteger)
    Questa prima parte indica che si tratta di un metodo di istanza Objective C che restituisce un object NSInteger. il trattino - (trattino) indica che questo è un metodo di istanza , dove un + indica che questo è un metodo di class . Il primo valore tra parentesi è il tipo di ritorno del metodo.

  • pickerView:
    Questa parte è una parte del nome del messaggio . Il nome completo del messaggio in questo caso è pickerView:numberOfRowsInComponent: Il runtime Objective-C prende questa informazione di metodo e la invia al ricevitore indicato. In puro C, questo sarebbe simile
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component) . Tuttavia, poiché questo è Objective-C, ulteriori informazioni sono inserite nel nome del messaggio.

  • (UIPickerView*)pickerView
    Questa parte è parte dell’input . L’input qui è di tipo UIPickerView* e ha un nome di variabile locale di pickerView.

  • numberOfRowsInComponent:
    Questa parte è la seconda parte del nome del messaggio . Come puoi vedere qui, i nomi dei messaggi vengono suddivisi per aiutare a indicare quali informazioni stai trasmettendo al destinatario. Pertanto, se dovessi inviare un messaggio a myObject con le variabili foo e bar, digitare:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    al contrario dello stile C ++:
    myObject.pickerView(foo, bar); .

  • (NSInteger)component
    Questa è l’ultima parte dell’input . l’input qui è di tipo NSInteger e ha un nome di variabile locale del componente.

In Objective-C, il nome di un metodo è composto da tutte le parti della dichiarazione che non sono argomenti e tipi. Il nome di questo metodo sarebbe quindi:

 pickerView:numberOfRowsInComponent: 

Il metodo sarebbe equivalente a una funzione in stile C simile a quella seguente:

modifica: (grazie a Jarret Hardie ):

 NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component) 

Aggiungendo alle risposte precedenti, vorrei solo dire che i metodi Objective-C (o i messaggi se si preferisce) hanno nomi di parametri esterni e interni .

Quindi in questo caso:

 - PickerView (NSInteger): (UIPickerView *) pickerView 
  numberOfRowsInComponent: componente (NSInteger)

numberOfRowsInComponent è un nome esterno , che useresti quando chiami questo metodo dall’esterno.

E il componente è il nome interno del parametro – nome che usi per riferirsi al parametro dall’interno del metodo.

Spero che lo risolva abit.

Mi sembra che le firme del metodo Objective-C siano più simili a frasi. Ogni parametro merita una parte nel nome del metodo. Ad esempio, in C potremmo avere un metodo ( setPersonData ) per l’impostazione di alcune informazioni sulla persona:

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

e in Objective-C il metodo sarebbe più descrittivo ( setPersonName: andAge: andHeight:) , come

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