私はこれに対する答えを求めて Apple の委任とプロトコルのドキュメントを探し回っていましたが、1 日以上経った後、諦めて皆さんに試してもらうことにしました。HTTPManager、LoginManager、および FetchManager の 3 つのクラスがあります。これらのクラスが何をするかはおそらく推測できますが、明確にするために...
- HTTPManager - NSURLConnection をラップし、LoginManager と FetchManager が認証を使用して HTTP 要求を実行するためのシンプルなインターフェイスを提供します。
- LoginManager / FetchManager - 基本的に同じクラスですが、HTTPManager のメッセージへの応答が異なります。
HTTPManager は、デリゲートが HTTPManagerDelegate プロトコルを実装することを期待しており、LoginManager と FetchManager の両方がこれを行います。Login- クラスと FetchManager クラスは、アプリケーション デリゲート用のプロトコルも提供するので、データをユーザー インターフェイスに戻すことができます。
アプリケーション デリゲートのinit:メソッド内で、ログイン マネージャーとフェッチ マネージャーの両方を初期化すると、両方に対して次の警告が表示されます。
warning: class 'MyAppDelegate' does not implement the 'HTTPManagerDelegate' protocol
warning: incompatible Objective-C types assigning 'struct HTTPManager *', expected 'struct LoginManager *'
初期化される 2 つのクラスはどちらも HTTPManager から派生したものではありませんが、HTTPManagerDelegate プロトコルを実装しています。上記の警告を生成するコード行は次のとおりです。
_loginMgr = [[LoginManager alloc] initWithDelegate:self];
では、一体何が LoginManager のinitWithDelegate:メソッドに を返させているのHTTPManager*でしょうか? 継承はなく、私の戻り値の型は正しいので、私にとってこれは私が最善を尽くすことのできない暗い形のブードゥー教です。
これが私のアプリケーションのシェルです。タイプミスや小さな不一致がある可能性がありますので、構文上の問題を想定する前に質問してください。
// HTTPManager.h
@protocol HTTPManagerDelegate
...
@end
@interface HTTPManager : NSObject
{
id <HTTPManagerDelegate> _delegate;
...
}
- (HTTPManager *) initWithDelegate:(id <HTTPManagerDelegate>)delegate;
...
@end
// LoginManager.h
@protocol LoginManagerDelegate
...
@end
@interface LoginManager : NSObject <HTTPManagerDelegate>
{
id <LoginManagerDelegate> _delegate;
...
}
- (LoginManager *) initWithDelegate:(id <LoginManagerDelegate>)delegate;
...
@end
// MyAppDelegate.h
@interface MyAppDelegate : NSObject <NSApplicationDelegate, LoginManagerDelegate, FetchManagerDelegate>
{
LoginManager *_loginMgr;
...
}
...
@end
// MyAppDelegate.m
...
- (MyAppDelegate *) init
{
self = [super init];
if (self)
{
// WARNING HAPPENS HERE
_loginMgr = [[LoginManager alloc] initWithDelegate:self];
...
}
return self;
}
...
前もって感謝します。