6

私は、#importの代わりに@classをヘッダーファイルに使用するべきだと読んだことがありますが、試しているデリゲートプロトコルが@classに含まれているとこれが機能しません使用する。@classを使用してデリゲートプロトコルの宣言にアクセスする

MyView.h私は私が何かを見下ろすと思う

#import <UIKit/UIKit.h> 
@class MyCustomClass; // <-- doesn't work for MyCustomClassDelegate, used below 

@interface MyView : UIView <MyCustomClassDelegate> 

@end 

は、@classはこのような状況で動作するようにまたは#import私の唯一の選択肢である取得する方法はありますか?

編集:これはもちろん、#import MyCustomClassとMyCustomClassDelegateを.hファイルの代わりに.mファイルのプライベートインターフェイスセクションに宣言することです。

答えて

5

あなたが唯一のメソッドの戻り値の使用のために同じヘッダファイル内のプロトコルを前方に宣言することができますまたはパラメータタイプ。あなたの場合、クラスをプロトコルに準拠させたいので、クラス自体に追加される動作(つまり、それが応答するメソッド)を定義するので動作しません。

したがって、プロトコルは#importでなければなりません。このため、プロトコルとクラスを別々のファイルに分割することをお勧めします。詳細については、this answerを参照してください。

+2

ピットをニックネッシュにするのではなく、より正確にする:プロトコルをフォワード宣言できますが、そのプロトコルに準拠したクラスを宣言している場合は(そのヘッダーファイル内では)できません。プロトコルがメソッドの戻り値またはパラメータ型にのみ必要な場合は、それを宣言しても構いません( "@class MyProtocol;"の代わりに "@protocol MyProtocol;"を使用してください)。 – erikprice

+0

更新しました。 – Senseful

4

MyCustomClassDelegateは、クラスではなく、プロトコルです。 MyCustomClassの存在についてコンパイラに伝えれば、プロトコルの存在について何も教えてくれません。

2

あなたはクラスの前に、あなたのデリゲートプロトコルを宣言する必要があります。

MyCustomClass.h:

#import <UIKit/UIKit.h> 
@class MyCustomClass; 

@protocol MyCustomClassDelegate <NSObject> 

- (void)myCustomClass:(MyCustomClass *)customClass 
       didBlah:(BOOL)blah; 

@end 

@interface MyCustomClass : NSObject <MyCustomClassDelegate> 

@end 

そして、あなたもデリゲートプロトコルを転送-宣言する@protocolを使用することはできません。コンパイラは、したがって、#importのためのあなたの@classを変更する、完全な宣言を参照してくださいする必要があります。

MyView.h:

#import <UIKit/UIKit.h> 
#import "MyCustomClass.h" // the compile now knows what MyCustomClassDelegate is 

@interface MyView : UIView <MyCustomClassDelegate> 

@end 
+1

ehhh?私は彼がプロトコルがすでに参照しているクラスで宣言されているので、再度宣言する必要はないということです。 – Bot

+0

@Botああ、はい、 '@class'ではなく'#import'を使うだけです。私の間違い。 – trojanfoe

9

あなたが唯一のこのような変数のためにそれを必要とする場合は、プロトコルを宣言転送するために@protocolを使用することができます。

@protocol MyProtocol; 

@interface MyClass { 
    id<MyProtocol> var; 
} 
@end 

あなたのケースでは、あなたのクラスは、それはそれについて知っている必要がありますので、プロトコルに準拠しようとしています。 あなたのオプションは、プロトコルを独自のファイルに分割し、そのヘッダを#importするか、それを使用するクラス宣言の上にそのヘッダのプロトコルを宣言することです。

フレームワークなどの一部の場合は#クラスファイルを含めて、通常はそれほど心配しないでください

関連する問題