Ios 如何遵守定义具有相同名称和不同签名的方法的两个协议?

Ios 如何遵守定义具有相同名称和不同签名的方法的两个协议?,ios,objective-c,gamekit,overloading,Ios,Objective C,Gamekit,Overloading,我正在使用iOS7的新功能,多点连接。它附带一个函数didChangeState: 在ViewController.h中 #import <GameKit/GameKit.h> #import <MultipeerConnectivity/MultipeerConnectivity.h> @interface ViewController : UIViewController <GKPeerPickerControllerDelegate, GKSessionDel

我正在使用iOS7的新功能,多点连接。它附带一个函数
didChangeState:

在ViewController.h中

#import <GameKit/GameKit.h>
#import <MultipeerConnectivity/MultipeerConnectivity.h>
@interface ViewController : UIViewController <GKPeerPickerControllerDelegate, GKSessionDelegate, MCBrowserViewControllerDelegate, MCSessionDelegate>
//名称与iOS6 Gamekit函数重复:

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { ...... }

既然iOS不支持函数重载,我应该如何在同一个程序中包含这两个函数?它无法编译。错误:方法“session:peer:didChangeState”的声明重复:“我正在使用最新的XCode 5.0.1。

问题不是来自导入这两个框架,而是来自同时符合
gksessionelegate
mcsessionelegate
的类在同一个类中实现这两个方法是无法做到的,因为它们具有相同的名称

您必须使用两个不同的类,一个符合
gksessionelegate
,另一个符合
mcsessionelegate


原始答案 继续吧,把它们包括进去

导入两个定义同名方法的类绝不是方法重载

在同一类层次结构上定义具有相同名称但不同签名的多个方法时,会发生重载,但这里的情况并非如此(而且永远不会如此,因为在Objective-C中禁止重载)


您可能遇到的唯一问题是,当您没有提供足够的信息时,编译器无法正确地进行类型检查

例如,如果你这样做

id anObject = //... retrieve the object
[anObject session:aSession peer:anId didChangeState:aState]
编译器将警告您,他无法理解您正在调用的两个方法中的哪一个,因为没有关于类型的信息。一个简单的强制转换将使编译器安静下来

不过,在运行时,您不会遇到问题,因为类型将被动态解析


例如,您可以参考最近的问题:

除非这些是同一类层次结构中的函数,否则它们不会冲突。这肯定不是因为您在问题中提到的问题,请说明如何导入这两个方法。我无法重现该问题,还有一些你忽略的东西,很可能是你有循环包含问题。或者,其中一个定义位于预编译标题中。@user2957392请编辑问题并包含您用于导入框架的实际代码。Objective C运行时不区分
NSString
和任何其他类型。只有对象类型不同的签名是不允许的。@Neal我知道。我的回答的哪一部分说的不同?我没有看到对这个问题的评论。我错误地认为,您是在建议他将两者放在同一个类中,并简单地抑制或忽略警告是可以的。我道歉。我想补充一点,如果编译器警告你,有一个问题应该解决。明白了,但我不同意你的上一句话。编译器无法消除歧义不一定是问题的征兆。@GabrielePetronella实际上,这是歧义的迹象,编译器(尤其是ARC编译器)正在远离这种现象。如果
anObject
来自MultiPeerConnectivity,但GameKit正在调用该方法,则。。。繁荣
id anObject = //... retrieve the object
[anObject session:aSession peer:anId didChangeState:aState]