2 つのクラスがあり、両方に実装するプロトコルがあります。
クラスのプロトコルの 1 つを別のプロトコルに実装できますか? その逆も可能ですか?
これにより実行時エラーが発生しますか?
2 つのクラスがあり、両方に実装するプロトコルがあります。
クラスのプロトコルの 1 つを別のプロトコルに実装できますか? その逆も可能ですか?
これにより実行時エラーが発生しますか?
あなたの問題は循環依存です。プロトコルの定義が表示されないことをコンパイラーが警告するだけなので、前方宣言も実際には役に立ちません。2つのオプションがあります。
プロトコルを独自のヘッダーファイルに分割します。
ClassA.h:
#import <Foundation/Foundation.h>
#import "ClassBProtocol.h"
@interface ClassA : NSObject <ClassBProtocol>
@end
ClassB.h:
#import <Foundation/Foundation.h>
#import "ClassAProtocol.h"
@interface ClassB : NSObject <ClassAProtocol>
@end
ClassAProtocol.h:
#import <Foundation/Foundation.h>
@protocol ClassAProtocol <NSObject>
...
@end
ClassBProtocol.h:
#import <Foundation/Foundation.h>
@protocol ClassBProtocol <NSObject>
...
@end
プロトコルを実装していることを外部で宣言する必要がない場合は、クラス継続カテゴリを使用できます。
ClassA.h:
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end
ClassA.m:
#import "ClassA.h"
#import "ClassB.h"
@implementation ClassA () <ClassBProtocol>
@end
@implementation ClassA
@end
ClassB.h:
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end
ClassB.m:
#import "ClassB.h"
#import "ClassA.h"
@implementation ClassB () <ClassAProtocol>
@end
@implementation ClassB
@end
しかし、私はこれが本当に必要だとは思わない。デリゲートを実装したら、同じデリゲート オブジェクトとして他のクラスにメッセージを送信できます。単純なデリゲート関係を次のように仮定します。
クラスA
@protocol ClassAProtocol;
@interface ClassA:NSObject
@property(nonatomic, assign) id<ClassAProtocol> delegate;
@end
@protocol ClassAProtocol <NSObject>
-(void)classA:(ClassA*)classa didSomething:(id)object;
@end
@implementation ClassA
-(void)classAFinishedSomething{
[self.delegate classA:self didSomething:nil];
[(ClassB*)self.delegate doSomething];
}
@end
クラスB
@interface ClassB : NSObject<ClassAProtocol>
-(void)doSomething;
@end
@implementation ClassB
-(void)doSomething{
}
-(void)classA:(ClassA*)classa didSomething:(id)object{
}
@end
これにより、2 つのオブジェクト間に循環参照が作成されず、コードがきれいに保たれると思います。このロジックは、デリゲートが常にクラス B であり、メッセージとしてクラス B に送信されるものに応答する場合に有効です。ただし、クラス間でログを分離し、標準メカニズムを介して通信します。