2009-08-20 16 views
3

申し訳ありませんが、同じヘッダーファイルに2つのプロトコルがあります。それらをProtocol1とProtocol2としましょう。私は両方のプロトコルに準拠し、メインアプリコントローラ、および以下のメンバーを持っているのNSWindowControllerサブクラス持っている:私はid型が適合していない」というのが私のNSWindowControllerサブクラス実装の最後に警告を取得していますタイプID <Protocol1>はID <Protocol2>に準拠していません。

id <Protocol1, Protocol2> delegate; 

を「プロトコル2へ」。しかし、示されているように、デリゲートは両方のプロトコルに準拠している必要があります。

さらに、アプリケーションは完全に機能します。これを行うには他の方法がありますか?私は2つのプロトコルを一緒に折り畳むことができると思いますが、それはプログラムのモジュール性を損なうでしょう。

EDIT:

ここでは2つのプロトコルです。これはテストシナリオの詳細なので、短いです。

@protocol TPTBController <NSObject> 

-(void)sendGrowlMessage:(NSString *)message title:(NSString *)title; 

@end 

@protocol AddPower <NSObject> 

-(void)addPower:(NSArray *)array; 
-(void)setCanAddPower:(BOOL)can; 

@end 
+0

2つのプロトコル宣言を表示できますか? – bbum

+0

確かに、編集した質問を確認してください。彼らは同じファイルに入っています。 – Cinder6

答えて

3

id-with-protocolsが実際にプロトコルリストをサポートしているかどうかは、言語仕様が明確ではありません。プロトコルはプロトコルリストを拡張することができますが、その構文がサポートするかどうかは不明です。

あなたは組み合わせプロトコル作成することができます。エレガントなものではないが

@protocol AddPowerAndTPTBController <AddPower, TPTBController> 
@end 
... 
id <AddPowerAndTPTBController> delegate; 

を、それが働くだろう。デリゲートクラスは、2つだけでなく、AddPoewrAndTPTBControllerにも準拠する必要があります。

+0

これは機能しました。デリゲートをプロパティにし、そのIDのために採用されたプロトコルをそのように指定することで、別の方法も見つけました。 – Cinder6

0

NSWindowControllerサブクラスでプロトコルをインポートしていますか?

アプリケーションがその方向で私を指し示していること。静的なチェックを行うと、コンパイラはクラスがプロトコルに準拠しているとは思われませんが、実際にメッセージを送信すると正常に動作します(アプリケーションが期待どおりに動作する理由)

+0

ええ、私はサブクラスのヘッダーファイルでプロトコルを#importしました。それは、プロトコルの1つがおそらく適合していないと不平を言うだけであることは、私にとって特に奇妙なようです。これは、デリゲートの宣言を無視しているかのようです。 – Cinder6

0

プロトコルを別々のファイルに分けて、両方ともあなたのNSWindowControllerクラスにインポートしますか?

関連する問題