Objective-C中的方法重载?
据我所知,Objective-C不支持方法重载。 在Objective-C中可以select什么呢? 或者我应该总是使用不同的方法名称?
正确的,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的函数重载。虽然不是你想要的,但在某些情况下可能certificate是有用的(例如,何时实现访问者devise模式 的轻微黑客(违背封装)版本 )
下面是关于函数重载如何工作的一个简单例子:
__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在Objective-C中不支持重载方法。 从这个意义上说,它与PHP类似。 正如他也指出的那样,通常的做法是以他的例子的方式定义两个或更多不同签名的方法。 但是,也可以使用“id”types创build一个方法。 通过“id”types,你可以发送任何对象(以及使用NSNumber类的任何原语)到方法中,然后从方法本身中,你可以testing它的types,并在必要时抛出适当的exception。 尽pipe这确实有轻微的性能下降,但除非您正在处理大量的数据,否则它很可能是名义上的或微不足道的。
- (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]; } }
这也是一个美丽的地方来执行一个协议来强制对象types,可以这样做:
(id<MyProtocol>)object