Come si scrive un metodo/messaggio con più parametri?Come scrivere un metodo/messaggio con più parametri?
MODIFICA: come più parametri per un singolo metodo/messaggio, intendo.
Come si scrive un metodo/messaggio con più parametri?Come scrivere un metodo/messaggio con più parametri?
MODIFICA: come più parametri per un singolo metodo/messaggio, intendo.
È 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
.
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.
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.
La spiegazione del concetto di oggetto-c anche con il confronto con JAVA è davvero utile per me capirlo. Ottimo post! – wao813
questo è più metodi, no? – Devoted
No. La chiamata è racchiusa in un singolo set di [] quindi deve essere un metodo singolo. È un unico metodo con 4 parametri. –