Перегрузка метода в Objective-C? - PullRequest
       14

Перегрузка метода в Objective-C?

126 голосов
/ 18 февраля 2010

Насколько мне известно, Objective-C не поддерживает перегрузку методов.Что может быть альтернативой этому в Objective-C?Или я всегда должен использовать другое имя метода?

Ответы [ 3 ]

185 голосов
/ 18 февраля 2010

Правильный, target-C не поддерживает перегрузку методов, поэтому вы должны использовать разные имена методов.

Обратите внимание, что «имя метода» включает ключевые слова сигнатуры метода (параметр имена, которые идут перед ":" s, поэтому ниже приведены два разных метода, хотя оба они начинают "writeToFile":

-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;

(имена двух методов: "writeToFile: fromInt:" и "writeToFile: fromString:").

22 голосов
/ 04 января 2013

Стоит упомянуть, что даже если Objective-C не поддерживает перегрузку метода , Clang + LLVM поддерживает перегрузку function для C. Хотя это не совсем то, что вы В некоторых ситуациях это может оказаться полезным (например, при реализации слегка взломанной (идет вразрез с инкапсуляцией) версии шаблона проектирования посетителей )

Вот простой пример того, как работает перегрузка функций:

__attribute__((overloadable)) float area(Circle * this)
{
    return M_PI*this.radius*this.radius;
}

__attribute__((overloadable)) float area(Rectangle * this)
{
    return this.w*this.h;
}

//...
//In your Obj-C methods you can call:
NSLog(@"%f %f", area(rect), area(circle));
19 голосов
/ 02 августа 2011

Дэвид прав в том, что перегрузка метода не поддерживается в Objective-C.Это похоже на PHP в этом смысле.Как он также указывает, обычной практикой является определение двух или более методов с разными сигнатурами в манере, которую он приводит.Однако также возможно создать один метод, используя тип «id».Через тип «id» вы можете отправить любой объект (и любые примитивы, использующие класс NSNumber) в метод, а затем из самого метода вы можете проверить его тип и при необходимости вызвать соответствующее исключение.Хотя это имеет незначительное снижение производительности, оно, скорее всего, будет номинальным или незначительным, если вы не обрабатываете большие объемы данных.

- (void) writeToFile: (NSString *)path fromObject: (id)object {
    if (!([object isKindOfClass: [NSNumber class]] || [object isKindOfClass: [NSString class]])) {
         @throw [NSException exceptionWithName: @"InvalidArgumentException" reason: @"Unrecognized parameter type." userInfo: nil];
    }
}

Это также прекрасное место для реализации протокола для принудительного применения типа объекта, что можно сделать так:

(id<MyProtocol>)object
...