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



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

642   3  

3 ответов:

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

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

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

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

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

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

__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));

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

Comments

    Ничего не найдено.