2009-07-01 11 views

risposta

29

È possibile scrivere la dichiarazione in quanto tale:

- (void) drawRoundedRect:(NSRect)aRect inView:(NSView *)aView withColor:(NSColor *)color fill:(BOOL)fill 

La chiamata successiva (con 4 parametri) potrebbe essere simile:

[self drawRoundedRect:rect inView:self withColor:[NSColor greenColor] fill:YES]; 

dove rect è un definito in precedenza NSRect, self è la NSView viene chiamato il metodo da, un oggetto NSColor ottenuto da una chiamata di metodo nidificata e il valore booleano costante YES.

+0

questo è più metodi, no? – Devoted

+1

No. La chiamata è racchiusa in un singolo set di [] quindi deve essere un metodo singolo. È un unico metodo con 4 parametri. –

2

Jeff ha accuratamente descritto come sono i metodi. Se volete vedere come apparirebbe come una funzione C, che sarebbe simile:

void drawRoundedRect_inView_withColor_fill(MyObject* self, SEL _cmd, NSRect aRect, NSView* aView, NSColor* color, BOOL fill); 

Il parametro "nomi" tutti si uniscono per formare un unico nome di metodo, e due parametri nascosti, di sé e _cmd sono aggiunti in primo piano.

14

In Objective-C, i nomi dei metodi sono correttamente denominati "selettori" e possono essere composti da una o più parti. Se il metodo accetta uno o più parametri, ciascuna parte del selettore è nella forma:

selectorFragmentName:(ParameterType)parameterName 

Ad esempio, si vedrà dichiarazioni di metodi come questa di NSColor:

+ (NSColor*) colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; 

In questo caso , il nome del metodo (selettore) è colorWithDeviceRed: verde: blu: alfa: - il resto indica l'ambito (- per esempio il metodo, + per la classe), il tipo restituito (NSColor * qui) e il tipo e il nome per ogni parametro.

CRITICO! Diversamente dalla maggior parte degli altri linguaggi, non è possibile sovraccaricare i metodi in Objective-C - questo significa che non è possibile avere due metodi con lo stesso selettore ma un numero diverso di parametri e/o ordine di tipi. Ad esempio, non si possono avere questi due metodi:

- (id) initWithObjects:(NSArray*)anArray; 
- (id) initWithObjects:(NSSet*)aSet; 

Dal momento che il nome del selettore per entrambi è initWithObjects: Objective-C non distingue tra i due. I nomi dei selettori sono tradotti in numeri interi univoci per una ricerca estremamente rapida, il che è utile nel runtime dinamico, ma una delusione per le persone che si aspettano un sovraccarico del metodo. Il caso più comune di sovraccarico in linguaggi come Java è il costruttore, che non è un problema in Objective-C a causa del pattern alloc/init. Per altri metodi, la scelta di nomi univoci evita il problema.

Dal punto di vista lo stile, dal momento che i parametri si alternano nel selettore metodo, i programmatori di Objective-C (e Xcode) spesso allineare le parti lunghe selettori al colon per una migliore leggibilità, sia per la dichiarazione/definizione:

+ (NSColor*) colorWithDeviceRed:(CGFloat)red 
          green:(CGFloat)green 
          blue:(CGFloat)blue 
          alpha:(CGFloat)alpha; 

e invocazione:

NSColor* myColor = [NSColor colorWithDeviceRed:0.5 
             green:0.6 
              blue:0.7 
             alpha:0.9]; 

la spazio bianco è irrilevante per il compilatore. Se ti rende più facile leggere e capire, usalo sicuramente.

+0

La spiegazione del concetto di oggetto-c anche con il confronto con JAVA è davvero utile per me capirlo. Ottimo post! – wao813