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