Возможна ли перегрузка функций в Objective C? - PullRequest
7 голосов
/ 08 сентября 2010

Возможна ли перегрузка функции в Objective C?
Ну, большинство программистов говорит нет,
Но это выглядит возможно,
например:

-(int)AddMethod:(int)X :(int)Y
{
    return X + Y;
}
-(int)AddMethod:(int)X
{
    return X;
}

чтобы позвонить 1-й записать [self AddMethod :3];
чтобы позвонить последнему напишите [self AddMethod: 3 :4];

Ответы [ 7 ]

22 голосов
/ 08 сентября 2010

Перегрузка метода невозможна в Objective-C.Однако ваш пример на самом деле будет работать, потому что вы создали два разных метода с разными селекторами: -AddMethod:: и AddMethod:.Для каждого чередуемого параметра есть двоеточие.Можно также добавить текст, например, -addMethodX:Y:, но это не обязательно.

4 голосов
/ 08 сентября 2010

Нет, в основном потому, что Objective-C не использует функции, он использует методы.

Перегрузка метода, с другой стороны, возможна . Вроде.

Предположим, что класс с методом принимает аргумент в виде NSString * или const char *:

@interface SomeClass : NSObject {

}

- (void)doThingWithString:(NSString *)string;
- (void)doThingWithBytes:(const char *)bytes;

@end

Хотя сам метод не пойдет вокруг выбора правильного метода с заданным входом; можно было бы сказать, что doThing: был перегружен, по крайней мере в том смысле, что два метода используют разные параметры для достижения одинаковой функциональности.

2 голосов
/ 04 мая 2011

Вы можете начать с универсального метода, который маршрутизирует на основе типа объекта, который вы передаете.

- (void)doSomething:(id)obj;

Затем вы можете проверить тип, чтобы увидеть, является ли он NSData или UIImage, и направить его внутренне ксоответствующие методы.

- (void)doSomethingWithData:(NSData *)data;
- (void)doSomethingWithImage:(UIImage *)image;

Вы также можете выбрать поддержку только ожидаемых типов и постепенное отклонение для обработки неподдерживаемых типов или явного сбоя.

Найдите NSAssert1, NSAssert2 и т. д. для другого подхода.

2 голосов
/ 18 марта 2011

Технически, перегрузка метода невозможна в Objective-C. На практике вы обычно можете достичь тех же результатов, в том числе и в тех случаях, когда вы этого не сделали в C ++. В Objective-C имена методов включают двоеточие перед каждым аргументом, а двоеточия - ЧАСТЬ ИМЕНИ МЕТОДА, что означает, что в вашем примере используются разные имена методов. На практике это становится своего рода функциональностью псевдо-именованных параметров, и вы можете получить перегрузку псевдо-метода аргументом FUNCTION, а не аргументом TYPE. В большинстве случаев это на самом деле будет более полезным, но это не перегрузка метода в строгом смысле, потому что имена методов разные.

Пример:

-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 X2:(float)x2 Y2:(float)y2;  
-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 width:(float)width height:(float)height;  

Это будет работать в Objective-C, но вы не можете получить аналогичные функциональные возможности в C ++, потому что число и типы аргументов одинаковы, отличаются только функции аргументов. В некоторых случаях модель C ++ может обеспечить более полезную функциональность. Это демонстрирует класс NSKeyedArchiver:

-(void)encodeFloat:(float)realv forKey:(NSString *)key  
-(void)encodeInt32:(int32_t)intv forKey:(NSString *)key  

Здесь они должны были сделать типы аргументов частью имени метода, что некрасиво. Если бы я мог выбирать между перегрузкой C ++ и «перегрузкой» Objective-C, я все равно выбрал бы последнее.

0 голосов
/ 01 ноября 2013

Вы можете перегружать функции C новыми компиляторами - хотя синтаксис немного неуклюжий (ничего быстрого #define не может исправить), но он работает хорошо.

перегрузка функций в C

0 голосов
/ 19 октября 2012

Обратите внимание, что если вам нужно / нужно перегружать функции при объединении Objective-C с C ++, это возможно. Я упоминаю об этом только потому, что в XCode вам нужно изменить свой файл .m на файл .mm, чтобы он обрабатывал его таким образом, что вызвало у меня несколько минут.

Пример заголовка:

void addMethod(NSInteger a);
void addMethod(NSInteger a, NSInteger b);

Если вы включите это в файл .m, вы получите предупреждение:

Конфликтующие типы для 'addMethod'

Изменение файла .m в .mm устраняет проблему.

0 голосов
/ 03 мая 2011

Категории предоставляют еще один способ эмуляции перегрузки метода c-style в Objective C. В качестве примера рассмотрим следующие объявления интерфейса:

@interface MyClass
{
}
@end

@interface MyClass ( MethodVersion1 )
- (void) doSomething : (int) val;
@end

@interface MyClass ( MethodVersion2 )
- (void) doSomething : (double) val;
@end

Различные типы параметров разрешаются категориями.

...