Ios Objective-C中的方法重载?
据我所知,Objective-C不支持方法重载。在Objective-C中,有什么替代方案?或者我应该始终使用不同的方法名称吗?正确,objective-C不支持方法重载,因此必须使用不同的方法名称 但是请注意,“方法名称”包括方法签名关键字(参数 名称位于“:”之前,因此以下是两种不同的方法,尽管它们都以“writeToFile”开头:Ios Objective-C中的方法重载?,ios,objective-c,overloading,Ios,Objective C,Overloading,据我所知,Objective-C不支持方法重载。在Objective-C中,有什么替代方案?或者我应该始终使用不同的方法名称吗?正确,objective-C不支持方法重载,因此必须使用不同的方法名称 但是请注意,“方法名称”包括方法签名关键字(参数 名称位于“:”之前,因此以下是两种不同的方法,尽管它们都以“writeToFile”开头: (这两个方法的名称是“writeToFile:fromInt:”和“writeToFile:fromString:”)。David是正确的,因为Objecti
(这两个方法的名称是“writeToFile:fromInt:”和“writeToFile:fromString:”)。David是正确的,因为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];
}
}
这也是一个实现协议以强制对象类型的好地方,可以这样做:
(id<MyProtocol>)object
(id)对象
值得一提的是,即使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));
有人会认为,这个提示,再加上方法swizzling,确实会导致“重载”方法。。。为什么一个人需要使用
id
和iskindof class:
来处理,这是另一回事…@alexgray我明白你的意思,id
和iskindof class:
涵盖了大多数实际情况。您可能更喜欢重载的一个原因是自动选择最适合的特定类型,它会导致一个小的开销,用显式的类型检查来维护。CLAN文档明确地指出,它所做的是为C.提供C++名称的篡改,这基本上只是编译器通过在方法中以不同的方式命名对象来自动地在Objy-C中做什么。(以较长的形式)参数类型。@RaheelSadiq它没有重载,因为方法名(在ObjC中为:“选择器”)是不同的。如果writeToFile:from:定义了两次,并且只有参数类型不同,则这将是重载。但是,如上所述,ObjC不像Java和现在的Swift等其他语言那样支持这一点。不仅参数名称本身,而且甚至冒号也是方法名称的一部分,因此-(void)writeToFile:(NSString*)path:(int)anInt;(void)writeToFile:(NSString)path:(NSString)aString;也是不同的方法。
__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));