2
#import "MPOContactAuthorizationManager.h"

@protocol MPOContactAuthorizationManagerDelegate <NSObject>

- (void)authorizationManger:(MPOContactAuthorizationManager *)manager
      didUpdateContactState:(ContactsState)contactState;

@end

MPOContactAuthorizationManagerContactStateMPOContactAuthorizationManager で宣言されていても、型に解決されません。

#import "MPOContactAuthorizationManagerDelegate.h"

typedef enum _contactsState {
    kContactsStateUnknown,
    kContactsStateAllowed,
    kContactsStateDisallowed
} ContactsState;

@interface MPOContactAuthorizationManager : NSObject <UIAlertViewDelegate> {
    ContactsState _contactsAuthorizationState;;
}

@property (strong, nonatomic) NSObject<MPOContactAuthorizationManagerDelegate> *delegate;
@property (nonatomic) ContactsState contactsAuthorizationState;

これらが解決されない理由について何か考えはありますか? どちらも「Expected a type」というエラーが表示されます

ありがとうマイク

4

2 に答える 2

3

循環依存関係があります。行を削除して次の行を追加して、MPOContactAuthorizationManagerDelegate.hヘッダーを更新します。#import

@class MPOContactAuthorizationManager;

列の直前@protocol

両方を 1 つの .h ファイルに入れるだけです ( の前方宣言が必要ですMPOContactAuthorizationManager):

typedef enum _contactsState {
    kContactsStateUnknown,
    kContactsStateAllowed,
    kContactsStateDisallowed
} ContactsState;

@class MPOContactAuthorizationManager;

@protocol MPOContactAuthorizationManagerDelegate <NSObject>

- (void)authorizationManger:(MPOContactAuthorizationManager *)manager
      didUpdateContactState:(ContactsState)contactState;

@end

@interface MPOContactAuthorizationManager : NSObject <UIAlertViewDelegate> {
    ContactsState _contactsAuthorizationState;;
}

@property (strong, nonatomic) NSObject<MPOContactAuthorizationManagerDelegate> *delegate;
@property (nonatomic) ContactsState contactsAuthorizationState;
于 2013-09-04T00:10:54.407 に答える
1

プロトコルの前方宣言を使用して、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
于 2013-09-04T00:14:25.687 に答える