重复协议定义警告
问题描述:
首先,我已经看到this question以及this,但我的问题没有在那里解决。重复协议定义警告
我有一个在其自己的头文件中定义的协议ProtocolA
。然后我有两个类ClassA
和ClassB
,它们都符合这个协议,所以协议头被导入到它们的头文件中。
现在它变得有点复杂。在第三个ClassC
中使用(并因此导入)ClassA
。这个类符合第二个协议ProtocolB
。该协议也有自己的头文件,它使用和导入ClassB
。因此,我的ClassC
(直接或间接)导入ClassA
和ClassB
(两者均导入ProtocolA
)。这给我以下有关ProtocolA
的警告:
warning: duplicate protocol definition of '…' is ignored
为什么会发生这种情况?我的理解是,#import
宏是为了避免我们在#include
中遇到的这类问题而发明的。如何在不使用包含警卫的情况下解决问题?我无法真正删除任何进口。
编辑:这里是为了说明情况的代码:
ProtocolA.h
@protocol ProtocolA <NSObject>
- (void)someMethod;
@end
ClassA.h
#import "ProtocolA.h"
@interface ClassA : NSObject <ProtocolA>
...
@end
ClassB.h
#import "ProtocolA.h"
@interface ClassB : NSObject <ProtocolA>
typedef enum Type {
TypeB1,
TypeB2
} TypeB;
...
@end
ProtocolB.h
#import "ClassB.h"
@protocol ProtocolB <NSObject>
- (TypeB)someMethod;
@end
ClassC.h
#import "ProtocolB.h"
@interface ClassC : NSObject <ProtocolB>
...
@end
ClassC.m
#import "ClassC.h"
#import "ClassA.h" // the warning appears here
@implementation ClassC
...
@end
答
不ProtocolB
头导入ClassB
,只是用@class ClassB;
在它和删除#import "ClassB"
您需要发布代码;你的描述很难遵循。 – trojanfoe
我已经添加了示例代码。虽然我承认,但仍然很难遵循。 – pajevic
使用前向声明是答案。如果你只在'ClassB.h'内使用'ClassA *',那么在文件的开头使用'@class ClassA;'。协议一样。 – trojanfoe