【问题标题】:Objective-C resolve functions overloadingObjective-C 解决函数重载
【发布时间】:2014-05-21 13:37:19
【问题描述】:

我有一个使用 SDK“Foo”和 SDK“Bar”的 iOS 应用。 SDK“Foo”允许我设置一个响应的委托

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

和“Bar”允许相同:

-(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");
}

编译器指责我“重复声明方法'request:didFailWithError:'”

我该如何解决?

【问题讨论】:

标签: ios objective-c


【解决方案1】:

你必须声明一次方法并确定委托对象的类:

@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

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

【讨论】:

  • 虽然这是一个替代方案,但如果没有解释为什么你必须这样做,例如因为 Objective-c 不支持重载,我不能让自己给出 +1。只是要求一个简短的解释没什么大不了的
  • @Austin:它到底解决了什么问题?我猜 OP 正面临链接器错误。
  • @JeslyVarghese OP 正在尝试委托两个对象,其委托协议声明具有相同签名的方法。就编译器而言,这些是相同的方法
  • 我相信谁委派任务的问题出现在运行时。由于 Objective-C 不支持重载,所以我猜这个问题永远不会出现。那么区分委托对象的解决方案将是无关紧要的。 o/p 寻求解决链接器错误,但他对此并不清楚。所以,我在上下文中找不到答案。没什么大不了的,只是想知道是否遗漏了什么。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      相关资源
      最近更新 更多