繁体   English   中英

无法解析协议中的类型

[英]Can't Resolve Type in Protocol

#import "MPOContactAuthorizationManager.h"

@protocol MPOContactAuthorizationManagerDelegate <NSObject>

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

@end

MPOContactAuthorizationManagerContactState不解决,即使它们在MPOContactAuthorizationManager声明类型:

#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;

关于为什么这些无法解决的任何想法? 两者都收到错误“期望的类型”

谢谢迈克

您具有循环依赖关系。 通过取消#import行并添加以下内容来更新MPOContactAuthorizationManagerDelegate.h标头:

@class MPOContactAuthorizationManager;

@protocol行之前。

只需将它们放在一个.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;

通过使用协议的前向声明,替换从MPContactAuthorizationManager.h导入的“ MPOContactAuthorizationManagerDelegate.h”:

@protocol MPOContactAuthorizationManagerDelegate;

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

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

您需要在引用协议标头中的用户定义类型( ContactsState类型)时选择此导入方案-因此,此标头需要导入管理器的标头。 但是,在管理器的标题中,您仅将协议称为方法参数的类型,因此您可以在此处合法地进行前向声明。

通常,在某些情况下,您仅应从另一个导入一个标头:

  • 在标头中声明一个类,该类是另一个标头中定义的类的子类
  • 在另一个标头中定义的标头中引用用户定义的类型(例如,通过typedef
  • 在标头中声明一个类符合另一个标头中声明的协议
  • 在标头中声明另一个标头中定义的类的类别
  • 我想我忘记了一个,所以为那个节省了空间。

另请阅读此启发性答案

在公共方法参数和属性中需要协议和类名的更常见情况可以通过使用带有@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM