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

この問題は、2 つのフレームワークのインポートに起因するのではなく、クラスが と の両方GKSessionDelegateに準拠していることに起因していますMCSessionDelegateこれら 2 つのメソッドを同じクラスに実装することは、名前が同じであるため実行できません。

GKSessionDelegateに準拠するクラスと に準拠するクラスの 2 つの異なるクラスを使用する必要がありますMCSessionDelegate


元の答え

先に進んでそれらを含めてください。

同じ名前のメソッドを定義する 2 つのクラスをインポートすることは、決してメソッドのオーバーロードではありません。

オーバーロードは、同じクラス階層で同じ名前でシグネチャが異なる複数のメソッドを定義するときに発生しますが、ここでは当てはまりません (Objective-C では禁止されているため、決してそうなることはありません)。


唯一の問題は、十分な情報を提供しないと、コンパイラが正しく型チェックできないことです。

たとえば、

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

コンパイラは、型に関する情報がないため、呼び出している 2 つのメソッドのどちらかを理解できないことを警告します。単純なキャストは、コンパイラを静かにします。

ただし、型は動的に解決されるため、実行時に問題は発生しません。

例として、この最近の質問を参照できます: 「互換性のないポインター型」警告を取り除く方法は?

于 2013-11-05T18:00:16.290 に答える