3

2 つのクラスがあり、両方に実装するプロトコルがあります。

クラスのプロトコルの 1 つを別のプロトコルに実装できますか? その逆も可能ですか?

これにより実行時エラーが発生しますか?

4

2 に答える 2

3

あなたの問題は循環依存です。プロトコルの定義が表示されないことをコンパイラーが警告するだけなので、前方宣言も実際には役に立ちません。2つのオプションがあります。

オプション1

プロトコルを独自のヘッダーファイルに分割します。

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

オプション2

プロトコルを実装していることを外部で宣言する必要がない場合は、クラス継続カテゴリを使用できます。

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
于 2012-12-04T22:24:56.280 に答える
0

しかし、私はこれが本当に必要だとは思わない。デリゲートを実装したら、同じデリゲート オブジェクトとして他のクラスにメッセージを送信できます。単純なデリゲート関係を次のように仮定します。

クラス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 に送信されるものに応答する場合に有効です。ただし、クラス間でログを分離し、標準メカニズムを介して通信します。

于 2012-12-04T23:43:13.317 に答える