Ответы:
Правильно, objective-C не поддерживает перегрузку методов, поэтому вам придется использовать разные имена методов.
Однако обратите внимание, что «имя метода» включает ключевые слова сигнатуры метода (имена параметров, стоящие перед символом «: »), поэтому ниже представлены два разных метода, даже если они оба начинаются с «writeToFile»:
-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;
(имена двух методов - «writeToFile: fromInt:» и «writeToFile: fromString:»).
Возможно, стоит упомянуть, что даже если 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));
id
и находясь isKindOfClass:
в распоряжении, - это совсем другая история ...
id
и isKindOfClass:
охватываю большинство практических сценариев. Одна из причин, по которой вы можете предпочесть перегрузку, - это автоматический выбор наиболее конкретного типа, для которого требуется небольшая дополнительная нагрузка при явной проверке типов.
Дэвид прав в том, что перегрузка метода не поддерживается в 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