Sintassi del metodo in Objective-C


176

Qualcuno può spiegare questa sintassi della dichiarazione del metodo per me? In questa funzione, viene restituito il numero di righe di un UIPickerView (interfaccia utente della slot machine su iPhone). Da quanto ho capito, il metodo si chiama ' pickerView' e restituisce un NSInteger.

Passa in un puntatore a UIPickerview chiamato ' pickerView' ... innanzitutto, perché il metodo si chiama con lo stesso nome del parametro?

Successivamente c'è il parametro NSInteger chiamato componente che ci dice per quale componente stiamo contando le righe. La logica per decidere quale sia il 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];
}

Risposte:


358

I metodi Objective-C sono progettati per essere auto-documentati e prendono in prestito dalla ricca tradizione di Smalltalk.

Proverò a spiegare cosa hai qui -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component,.

  • - (NSInteger)
    Questa prima parte indica che si tratta di un metodo di istanza dell'obiettivo C che restituisce un oggetto NSInteger. il -trattino indica che si tratta di un metodo di istanza , dove a +indica che si tratta di un metodo di classe . Il primo valore tra parentesi è il tipo restituito del metodo.

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

  • (UIPickerView*)pickerView
    Questa parte fa 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 sono suddivisi per aiutare a indicare quali informazioni stai passando al destinatario. Quindi, se fossi al messaggio di un oggetto con il myObject variabili foo e bar, mi digitare:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    al contrario di stile C ++:
    myObject.pickerView(foo, bar);.

  • (NSInteger)component
    Questa è l'ultima porzione dell'input . l'input qui è di tipo NSIntegere ha un nome di variabile locale del componente.


18
+1 per un'ottima risposta. Suggerirei di cambiare "factory" in "class" nel primo punto, poiché "+" indica ufficialmente un metodo di classe. Accade così che molti metodi "+" siano metodi di fabbrica, ma questa non è la definizione corretta.
e.James

2
Grazie! Un'ulteriore domanda: se dovessi inviare un messaggio a un oggetto myObject con le variabili foo e bar come mostrato: [myObject pickerView: foo numberOfRowsInComponent: bar]; PickerView fa riferimento al nome o al parametro del metodo?
Craig,

2
Né. È buona norma fare riferimento sia al nome del metodo AND sia al parametro, ma il nome completo del metodo è effettivamente pickerView: numberOfRowsInComponent :. Se dovessi provare a invocare pickerView :, riceveresti un errore di runtime, poiché il metodo non esisterebbe.
Locriani,

1
Vorrei chiarire che: pickerView: porzione da sola DOVREBBE fare riferimento al seguente parametro, per seguire un buon stile di codifica. Tuttavia, è solo 1/2 del nome del metodo. Un esempio migliore potrebbe essere [myObject setX: foo Y: bar], dove il metodo è setX: Y :.
Locriani,

1
So che questa risposta è vecchia, ma ho vissuto in un mondo .NET negli ultimi anni. Sono nuovo dell'obiettivo C e sto passando da un mondo web all'industria mobile. Vorrei ringraziarti per una spiegazione così ben documentata che è così rilevante per la domanda. +1
d3v1lman1337,

52

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 che appariva come segue:

modifica: (grazie a Jarret Hardie ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

1
+1 - bella descrizione breve. A volte trovo che la lampadina si accenda per le persone se scrivi l'equivalente in stile C come "NSInteger pickerViewNumberOfRowsInCompoent (UIPickerView * pickerView, componente NSInteger)
Jarret Hardie

mi piace la tua spiegazione, riscrivere in C è molto meglio.
lcc

30

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

Quindi in questo caso:

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

numberOfRowsInComponentè il nome esterno , quello che useresti quando chiami questo metodo dall'esterno.

Ed componentè il nome interno del parametro, quello che usi per fare riferimento al parametro dall'interno del metodo.

Spero che chiarisca un po '.


1
In base alla descrizione, il nome del metodo potrebbe essere considerato come il nome esterno del primo parametro. Questo si adatta anche al muggito del commento di Wilczarz.
Jake,

Accidenti, trovo questa risposta così errata. Non c'è niente come un nome esterno / interno di parametri. È il TIPO e l'identificatore VARIABILE. Mi chiedo perché tutti provino così a definire ObjC come un linguaggio naturale, è così innaturale in tutti i suoi modi. È una lingua, tutto qui, permette di impararla senza usare parole fantasiose.
Siddharth,

Gli argomenti possono avere nomi interni / esterni. È vero.
lcc

21

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 impostare 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 {

8
E perché setPersonalData (char * andName, int alsoAge, float alsoHeight) non avrebbe senso? È tutto su ciò che capisci sulla sintassi, nulla sull'intenzione di progettisti di oggetti intelligenti di essere qui. hanno appena aggiunto un sacco di più sintassi che francamente non ha avuto alcun senso .. :)
Siddharth,

5
Hai frainteso la risposta, temo. setPersonalData (char * andName, int alsoAge, float alsoHeight) è una firma, non una chiamata. L'invocazione di questa funzione sarebbe setPersonData ("Tom", 25, 175) - e questo non dice molto? L'invocazione Obj-C sarebbe simile a questa: [persona setPersonName: @ "Tom" e Età: 25 e Altezza: 175];
Wilczarz,

3
Ora che ci penso, la mia risposta è più una lamentela che una dichiarazione. Non potrei essere più d'accordo.
Siddharth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.