Sobrecarga de métodos en Objective-C?

Por lo que yo sé, Objective-C no es compatible con la sobrecarga de métodos. ¿Cuál puede ser la alternativa para esto en Objective-C? ¿O debería usar siempre un nombre de método diferente?

Correcto, el objective C no es compatible con la sobrecarga de métodos, por lo que debe usar diferentes nombres de métodos.

Sin embargo, tenga en cuenta que el “nombre del método” incluye las palabras clave de la firma del método (los nombres de los parámetros que aparecen antes del “:” s), por lo que los siguientes son dos métodos diferentes , aunque ambos comiencen “writeToFile”:

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

(los nombres de los dos métodos son “writeToFile: fromInt:” y “writeToFile: fromString:”).

Vale la pena mencionar que incluso si Objective-C no admite la sobrecarga de métodos , Clang + LLVM admite la sobrecarga de funciones para C. Aunque no es exactamente lo que está buscando, podría ser útil en algunas situaciones (por ejemplo, cuando implementando una versión ligeramente pirateada (va en contra de la encapsulación) del patrón de diseño del visitante )

Aquí hay un ejemplo simple sobre cómo funciona la sobrecarga de funciones:

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

David tiene razón en que la sobrecarga de métodos no es compatible con Objective-C. Es similar a PHP en ese sentido. Como también señala, es una práctica común definir dos o más métodos con diferentes firmas de la manera en que lo ejemplifican. Sin embargo, también es posible crear un método usando el tipo “id”. A través del tipo “id”, puede enviar cualquier objeto (y cualquier primitiva usando la clase NSNumber) al método y luego desde el mismo método puede probar su tipo y lanzar la excepción apropiada si es necesario. Aunque esto tiene un impacto de rendimiento menor, lo más probable es que sea nominal o insignificante a menos que esté procesando grandes cantidades de datos.

 - (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]; } } 

Este es también un hermoso lugar para implementar un protocolo para aplicar el tipo de objeto, que se puede hacer de esta manera:

 (id)object