プロトコルの前方宣言を使用して、MPContactAuthorizationManager.h から "MPOContactAuthorizationManagerDelegate.h" のインポートを置き換えます。
@protocol MPOContactAuthorizationManagerDelegate;
typedef enum _contactsState {
kContactsStateUnknown,
kContactsStateAllowed,
kContactsStateDisallowed
} ContactsState;
@interface MPOContactAuthorizationManager : NSObject <UIAlertViewDelegate> {
ContactsState _contactsAuthorizationState;;
}
........
プロトコルのヘッダーでユーザー定義タイプ (タイプ) を参照しているため、このインポート スキームを選択する必要がありますContactsState
。したがって、このヘッダーはマネージャーのヘッダーをインポートする必要があります。ただし、マネージャーのヘッダーでは、プロトコルをメソッド パラメーターの型として参照するだけなので、ここで合法的に前方宣言できます。
一般に、いくつかのケースでは、1 つのヘッダーのみを別のヘッダーからインポートする必要があります。
- 他のヘッダーで定義されたクラスのサブクラスであるクラスをヘッダーで宣言する
typedef
他のヘッダーで定義されているヘッダー内のユーザー定義型を (たとえば a を介して) 参照する
- 別のヘッダーで宣言されたプロトコルに準拠するものとしてヘッダーでクラスを宣言する
- 別のヘッダーで定義されたクラスのヘッダーでカテゴリを宣言する
- 1つ忘れていると思うので、そのためにこのスペースを節約します。
また、この啓発的な回答をお読みください。
@class
パブリック メソッドのパラメーターとプロパティでプロトコル名とクラス名が必要になるより一般的なケースは、との前方宣言を使用して実現できます@protocol
。私だったら、承認マネージャーと同じヘッダーにプロトコル宣言を保持しますが、その方が便利なようです。このためには、ファイル内で前方宣言を行う必要があることに注意してください。例えば:
typedef enum _contactsState {
kContactsStateUnknown,
kContactsStateAllowed,
kContactsStateDisallowed
} ContactsState;
//forward-declare the protocol before referencing it in the file
@protocol MPOContactAuthorizationManager;
@interface MPOContactAuthorizationManager : NSObject <UIAlertViewDelegate> {
ContactsState _contactsAuthorizationState;;
}
@property (strong, nonatomic) NSObject<MPOContactAuthorizationManagerDelegate> *delegate;
@property (nonatomic) ContactsState contactsAuthorizationState;
........
@end
// Provide the real protocol declaration.
@protocol MPOContactAuthorizationManagerDelegate <NSObject>
- (void)authorizationManger:(MPOContactAuthorizationManager *)manager
didUpdateContactState:(ContactsState)contactState;
@end