0

デリゲートを転送するための汎用プロキシとして機能するクラスがあります。実装することでrespondsToSelectorforwardInvocationこのクラスを使用して、さまざまな UI コントロールのデリゲートに送信されるセレクターを転送できます。

問題は、このクラスを使用すると、コンパイラの警告が表示されることです。たとえば、メッセージを UITableViewDelegate に転送するために使用すると、次のようになります。

DelegateForwarder* _forward = [[DelegateForwarder alloc] init];
_tableView.delegate = _forward;

コンパイラの警告が表示されます:

Assigning to id<UITableViewDelegate> from incompatible type 'DelegateForwarder'

DelegateForwarder がデリゲートを採用していないために警告が生成されることはわかっていますが、デリゲートがUITableViewDelegate提供する転送メカニズムは完全に汎用的であるため、採用したくありません。

警告にもかかわらず、私のコードは意図したとおりに実行されます。

特定のプロトコルを採用していないという事実は問題にならないので、このクラスがメッセージ転送を使用することを何らかの方法でコンパイラとこのクラスのユーザーに示すためにできることはありますか?

4

2 に答える 2

3

コメントの拡大....

idは「ジェネリック オブジェクト型」と呼ばれるため、参照されるオブジェクトの性質が完全に動的であると見なされることを型チェック メカニズムに通知するために使用されます。これは、次のようなコードを意味します...

DelegateForwarder* _forward = [[DelegateForwarder alloc] init];
_tableView.delegate = _forward;

DelegateForwarder...変数の適合性をチェックする必要があることを意味しますが、...

id _forward = [[DelegateForwarder alloc] init];
_tableView.delegate = _forward;

...「信頼してください」タイプの宣言です。

于 2012-11-13T15:46:36.490 に答える
0

のプロトコルの<UITableViewDelegate>リストに追加したかどうかを確認してください。DelegateForwarder一般に、一般的な「id」型で初期化するよりも適切な方法です。

于 2012-11-13T15:51:33.140 に答える