Как написать метод/сообщение с несколькими параметрами?

Как вы пишете метод/сообщение с несколькими параметрами?

EDIT: Я имею в виду как несколько параметров для одного метода/сообщения.

Ответы

Ответ 1

Вы можете написать декларацию как таковую:

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

Следующий вызов (с 4 параметрами) может выглядеть так:

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

где rect - это ранее определенный NSRect, self - это NSView, из которого вызывается метод, объект NSColor, полученный из вложенного вызова метода, и константное булево значение YES.

Ответ 2

В Objective-C имена методов называются "селекторами" и могут состоять из одной или нескольких частей. Если метод принимает один или несколько параметров, каждая часть селектора имеет вид:

selectorFragmentName:(ParameterType)parameterName

Например, вы увидите объявления методов, подобные этому из NSColor:

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

В этом случае имя метода (селектор) colorWithDeviceRed: green: blue: alpha: - остальное означает область (- например, метод, + для класса), тип возврата (NSColor * здесь), а также тип и имя для каждого параметра.

CRITICAL! В отличие от большинства других языков, вы не можете перегружать методы в Objective-C - это означает, что вы не можете иметь два метода с одним и тем же селектором, но с различным количеством параметров и/или порядком типов, Например, вы не можете использовать эти два метода:

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

Так как имя селектора для обоих initWithObjects: Objective-C не различает их. Названия селекторов преобразуются в уникальные целые числа для чрезвычайно быстрого поиска, что полезно в динамической среде выполнения, но для людей, ожидающих перегрузки метода, это разочарование. Наиболее распространенным случаем перегрузки в таких языках, как Java, являются конструкторы, которые не являются проблемой в Objective-C из-за шаблона alloc/init. Для других методов выбор уникальных имен позволяет избежать проблемы.

С точки зрения стиля, поскольку параметры чередуются в селекторе методов, программисты Objective-C (и Xcode) часто выравнивают части длинных селекторов в двоеточии для удобочитаемости, как для объявления/определения:

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

и вызов:

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

Пробелы не имеют отношения к компилятору. Если вам будет легче читать и понимать, обязательно используйте его.

Ответ 3

Джефф точно описал, как выглядят методы. Если вы хотите увидеть, как это будет выглядеть как функция C, это выглядит примерно так:

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

Параметр "имена" объединяется вместе, чтобы сформировать одно имя метода, и два скрытых параметра, self и _cmd добавлены в начало.