3

我正在使用 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。

4

1 回答 1

9

问题不在于导入这两个框架,而在于您的类同时符合GKSessionDelegateand MCSessionDelegate. 在同一个类中实现这两个方法是您无法做到的,因为它们具有相同的名称。

您将不得不使用两种不同的类,一种符合,一种GKSessionDelegate符合 MCSessionDelegate.


原始答案

继续并包括它们。

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

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


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

例如,如果你这样做

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

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

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

例如,您可以参考这个最近的问题:如何摆脱“不兼容的指针类型”警告?

于 2013-11-05T18:00:16.290 回答