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

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

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

3 ответов


вы можете написать объявление так:

- (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, из которого вызывается метод, an NSColor объект, полученный из вложенного вызова метода, и постоянное логическое значение YES.


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

selectorFragmentName:(ParameterType)parameterName

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

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

в этом случае имя метода (селектора) -colorWithDeviceRed: зеленый: синий: Альфа: - остальное означает область (- например, метод, + для класса), возвращает тип (NSColor * здесь), а также тип и имя для каждого параметра.

критично! в отличие от большинства других языков, вы не можете перегружать методы в 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];

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


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

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

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