2009-07-01 11 views

Respuesta

29

Se puede escribir la declaración como tal:

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

La llamada posterior (con 4 parámetros) podría verse como:

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

donde rect es un definido previamente NSRect, self es el NSView se llama al método desde, un objeto NSColor obtenido de una llamada de método anidado, y el valor booleano constante YES.

+0

esto es métodos múltiples, ¿no? – Devoted

+1

No. La llamada se incluye en un único conjunto de [], por lo que debe ser un único método. Es un método único con 4 parámetros. –

2

Jeff describió con precisión cómo son los métodos. Si quieres ver cómo se vería como una función C, se vería algo como:

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

Los "nombres" de los parámetros todos se unen entre sí para formar un solo nombre del método, y dos parámetros ocultos, auto y _cmd se agregan al frente.

14

En Objective-C, los nombres de los métodos se denominan "selectores" y se pueden componer de una o más partes. Si el método acepta uno o más parámetros, cada parte del selector es de la forma:

selectorFragmentName:(ParameterType)parameterName 

Por ejemplo, verá declaraciones de métodos como éste de NSColor:

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

En este caso , el nombre del método (selector) es colorWithDeviceRed: verde: azul: alfa: - el resto significa el ámbito (- por ejemplo, método, + para la clase), tipo de retorno (NSColor * aquí), y el tipo y nombre para cada parámetro.

CRITICAL! A diferencia de la mayoría de los otros lenguajes, no puede sobrecargar los métodos en Objective-C; esto significa que no puede tener dos métodos con el mismo selector pero con diferentes parámetros y/o el orden de los tipos. Por ejemplo, no se puede tener estos dos métodos:

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

Desde el nombre de selección para ambos es initWithObjects: Objective-C no distingue entre los dos. Los nombres de selector se traducen en enteros únicos para una búsqueda extremadamente rápida, lo que es beneficioso en el tiempo de ejecución dinámico, pero una decepción para las personas que esperan una sobrecarga de métodos. El caso más común de sobrecarga en lenguajes como Java son los constructores, que no es un problema en Objective-C debido al patrón alloc/init. Para otros métodos, elegir nombres únicos evita el problema.

Desde un punto de vista del estilo, ya que los parámetros se intercalan en el selector de método, los programadores de Objective-C (y Xcode) a menudo alinear las partes de selectores largos en el colon para mejorar la legibilidad, tanto para la declaración/definición:

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

e invocación:

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

el espacio en blanco es irrelevante para el compilador. Si le resulta más fácil leer y comprender, definitivamente úsela.

+0

La explicación del concepto object-c incluso con la comparación con JAVA es realmente útil para que lo entienda. ¡Buena publicación! – wao813

Cuestiones relacionadas