在 Objective-C 中方法重载? ?

据我所知,Objective-C 不支持方法重载。在 Objective-C 中有什么替代方案?或者我应该总是使用不同的方法名?

46762 次浏览

正确,Objective-C 不支持方法重载,因此必须使用不同的方法名称。

但是请注意,“方法名称”包括方法签名关键字(参数 以下是两个 与众不同方法,尽管它们都以“ writeToFile”开头:

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

(这两个方法的名称分别是“ writeToFile: FROM Int:”和“ writeToFile: FROM String:”)。

在 Objective-C 中不支持方法重载这一点上,David 是正确的。在这个意义上,它类似于 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

值得一提的是,即使 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));