[英]Can't Resolve Type in Protocol
#import "MPOContactAuthorizationManager.h"
@protocol MPOContactAuthorizationManagerDelegate <NSObject>
- (void)authorizationManger:(MPOContactAuthorizationManager *)manager
didUpdateContactState:(ContactsState)contactState;
@end
MPOContactAuthorizationManager
和ContactState
不解决,即使它们在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.