重复协议定义警告

问题描述:

首先,我已经看到this question以及this,但我的问题没有在那里解决。重复协议定义警告

我有一个在其自己的头文件中定义的协议ProtocolA。然后我有两个类ClassAClassB,它们都符合这个协议,所以协议头被导入到它们的头文件中。

现在它变得有点复杂。在第三个ClassC中使用(并因此导入)ClassA。这个类符合第二个协议ProtocolB。该协议也有自己的头文件,它使用和导入ClassB。因此,我的ClassC(直接或间接)导入ClassAClassB(两者均导入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 
+0

您需要发布代码;你的描述很难遵循。 – trojanfoe

+0

我已经添加了示例代码。虽然我承认,但仍然很难遵循。 – pajevic

+0

使用前向声明是答案。如果你只在'ClassB.h'内使用'ClassA *',那么在文件的开头使用'@class ClassA;'。协议一样。 – trojanfoe

ProtocolB头导入ClassB,只是用@class ClassB;在它和删除#import "ClassB"

+0

没有任何迹象表明OP正在从协议头中导入类头,除非我错过了它... – trojanfoe

+0

再次阅读,“该类符合第二协议ProtocolB。该协议也有它自己的头文件,它使用和进口ClassB“。 – ogres

+0

'''ClassB'标头实际上是在'ProtocolB'中导入的。这是因为'ProtocolB'的方法之一返回了'ClassB'头部定义的枚举类型。因此'@class ClassB;'不会真正起作用,除非我可以以某种方式向前声明一个枚举。 – pajevic