sus*_*use 128 overloading objective-c ios
据我所知,Objective-C不支持方法重载.在Objective-C中可以替代什么?或者我应该总是使用不同的方法名称?
Dav*_*har 188
正确,objective-C不支持方法重载,因此您必须使用不同的方法名称.
但请注意,"方法名称"包括方法签名关键字(":"之前的参数名称),因此以下是两种不同的方法,即使它们都以"writeToFile"开头:
-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;
Run Code Online (Sandbox Code Playgroud)
(这两个方法的名称是"writeToFile:fromInt:"和"writeToFile:fromString:").
Val*_*adu 22
值得一提的是,即使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));
Run Code Online (Sandbox Code Playgroud)
Zim*_*nji 19
大卫是正确的,在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];
}
}
Run Code Online (Sandbox Code Playgroud)
这也是一个实现协议来强制执行对象类型的好地方,可以这样做:
(id<MyProtocol>)object
Run Code Online (Sandbox Code Playgroud)