首先,我已經看到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
您需要發佈代碼;你的描述很難遵循。 – trojanfoe
我已經添加了示例代碼。雖然我承認,但仍然很難遵循。 – pajevic
使用前向聲明是答案。如果你只在'ClassB.h'內使用'ClassA *',那麼在文件的開頭使用'@class ClassA;'。協議一樣。 – trojanfoe