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

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

Ответ 1

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

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

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

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

Ответ 2

Возможно, стоит отметить, что даже если Objective-C не поддерживает перегрузку метода, Clang + LLVM поддерживает перегрузку функции для 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));

Ответ 3

Дэвид прав в том, что перегрузка метода не поддерживается в 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