2014-05-21 35 views
0

我有一个使用SDK“Foo”和SDK“Bar”的iOS应用程序。 SDK“富”让我来设置responces到Objective-C解析函数重载

-(void)request:(Foo *)request didFailWithError:(NSError *)error 

,并委托“酒吧”允许相同:

-(void)request:(Bar *)request didFailWithError:(NSError *)error 

我有希望成为双方的SDK的委托类:

@interface MyApp : NSObject<FooDelegate, BarDelegate> 

@interface MyApp 

-(void)request:(Foo *)request didFailWithError:(NSError *)error 
{ 
    NSLog(@"Foo failed"); 
} 
-(void)request:(Bar *)request didFailWithError:(NSError *)error 
{ 
    NSLog(@"Bar failed"); 
} 

和编译器指责我 “的方法重​​复申报的要求:didFailWithError:”“

我该如何解决它?

+0

http://stackoverflow.com/q/2286312/542425 – 0x8badf00d

+0

什么是SDK“Foo”和SDK“Bar”?你知道SDK代表什么吗? – Popeye

回答

5

你必须一次申报方法和确定类的委托对象:

@implementation MyApp 

- (void)request:(id)request didFailWithError:(NSError *)error 
{ 
    if ([request isKindOfClass:[Foo class]) 
    { 
     Foo *fooRequest = (Foo *)request; 
     NSLog(@"Foo failed"); 
    } 
    else if ([request isKindOfClass:[Bar class]]) 
    { 
     Bar *barRequest = (Bar *)request; 
     NSLog(@"Bar failed"); 
    } 
} 

@end 

你的代码没有工作的原因是目标C不支持真正的方法重载,因为它是动态。尽管第一个参数的输入是Foo,但从技术上讲,任何类的对象都可以传入。另外值得一提的是,ObjC在运行时基本上使用字符串进行方法查找 - 这两种方法的选择器只是"request:didFailWithError:"

+0

虽然这是一种替代方案,但我不能让自己给出+1而不解释为什么您必须这样做,例如因为objective-c不支持超载。只是要求一个简短的解释没什么大的 – Popeye

+0

@奥斯汀:究竟是什么解决?我猜OP正面临链接器错误。 –

+2

@JeslyVarghese OP正在尝试为委托协议声明具有相同签名的方法的两个对象进行委托。就编译器而言,这些是_same method_。 – Austin

2

这背后的原因是Objective不支持方法重载:)由于其动态性质。

0

在Objective-C中,每个成员函数默认都是虚拟的。所以,没有办法可以重载。就参数相同而言,它们对编译器来说是相同的功能。您可以更改参数的名称,或者您需要按照Austin所建议的方法识别对象类型。

相关问题