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

Одним из хороших моментов, на мой взгляд, является Матрица структуры зависимостей : http://www.jetbrains.com/idea/features/dependency_analysis.html#link0

Хорошее введение в использование и преимущества DSM можно найти на веб-сайте Lattix (самостоятельный продукт): http://www.lattix.com/files/dl/slides/s.php?directory=4tour

16
задан Devoted 1 July 2009 в 00:22
поделиться

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, из которого вызывается метод,

33
ответ дан 30 November 2019 в 15:44
поделиться

В 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];

Пробел не имеет отношения к компилятору.

14
ответ дан 30 November 2019 в 15:44
поделиться

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

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

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

2
ответ дан 30 November 2019 в 15:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: