Как написать метод/сообщение с несколькими параметрами?
Как вы пишете метод/сообщение с несколькими параметрами?
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 добавлены в начало.