2015-11-05 110 views
1

首先,我已經看到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

回答

0

ProtocolB頭導入ClassB,只是用@class ClassB;在它和刪除#import "ClassB"

+0

沒有任何跡象表明OP正在從協議頭中導入類頭,除非我錯過了它... – trojanfoe

+0

再次閱讀,「該類符合第二協議ProtocolB。該協議也有它自己的頭文件,它使用和進口ClassB「。 – ogres

+0

'''ClassB'標頭實際上是在'ProtocolB'中導入的。這是因爲'ProtocolB'的方法之一返回了'ClassB'頭部定義的枚舉類型。因此'@class ClassB;'不會真正起作用,除非我可以以某種方式向前聲明一個枚舉。 – pajevic