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

时间:2013-11-05 17:57:56

标签: ios objective-c gamekit overloading

我正在使用iOS7的新功能MultipeerConnectivity。它附带一个函数didChangeState:

ViewController.h中的

#import <GameKit/GameKit.h>
#import <MultipeerConnectivity/MultipeerConnectivity.h>
@interface ViewController : UIViewController <GKPeerPickerControllerDelegate, GKSessionDelegate, MCBrowserViewControllerDelegate, MCSessionDelegate>
ViewController.m中的

, 要实现以下两种方法:

- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state{ ...... }

//名称与iOS6 Gamekit功能重复:

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

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

1 个答案:

答案 0 :(得分:9)

问题不是来自导入这两个框架,而是来自符合GKSessionDelegateMCSessionDelegate的类。 在同一个类中实现这两个方法是你不能做的事情,因为它们具有相同的名称。

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


原始答案

请继续加入。

导入两个定义具有相同名称的方法的类绝不是方法重载。

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


您可能遇到的唯一问题是,如果您没有提供足够的信息,编译器无法正确键入检查。

例如,如果你这样做

id anObject = //... retrieve the object
[anObject session:aSession peer:anId didChangeState:aState]

编译器会警告您,他无法理解您调用的两种方法中的哪一种,因为没有关于该类型的信息。一个简单的演员阵容将使编译器安静下来。

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

例如,您可以参考最近的这个问题:How to get rid of the "Incompatible pointer types" warning?