获取“重复接口定义”错误,肯定要#import ing头文件

我正在帮助一个iOS项目,这个项目有许多AppDelegate中许多不同类所共有的方法和定义。 因此,在这些类中的每一个.h文件中,我使用#import“AppDelegate.h”。 这工作正常,直到我需要访问已经导入AppDelegate导入AppDelegate的另一个类中的那些类之一。 在这一点上,我得到了AppDelegate的重复接口定义错误。

好的,这样看起来很公平。 我已经将AppDelegate导入到正在导入的文件中,所以AppDelegate从两个不同的位置导入。 所以我删除AppDelegate行,一切都很好。

但是当我需要导入两个需要导入AppDelegate的类时会发生什么?

我有一个非常具体的问题,我试图把我的头围绕,而且我知道这是由与此有关的事情造成的,但是我不确定是什么。 所以我希望能弄清楚我应该如何处理这种导入,然后排除其他所有东西,并希望这能解决我的问题。 所以要更具体一些:

我有ClassA.h,ClassB.h和ClassC.h。 所有#import“AppDelegate.h”。 当我需要在ClassA中使用#import“ClassB.h”时,我从ClassA中删除#import“AppDelegate.h”行。 一切顺利。 但是,如果我还需要#将“ClassC.h”导入到ClassA中,而ClassB和ClassC需要#import“AppDelegate.h”,会发生什么?

编辑:

我在一个干净的项目中尝试了上面描述的确切场景,并且构build得很好,所以还有其他的东西在起作用。 但我可以肯定地说,当这个问题出现在这个项目之前,它是一个重复的AppDelegate接口定义,当我删除#import“AppDelegate.h”这一行时,错误消失了,而且我仍然有权访问AppDelegate.h方法并通过其他导入的文件枚举。

最好的预防和治疗方法是遵循一些关于何时从头文件导入的指导。 一般来说,除了这些情况外,不要从Objective-C头文件中导入:

  1. 您需要扩展在另一个头中声明的类。
  2. 您需要声明符合另一个头中声明的协议。
  3. 您需要引用公共方法和/或属性中另一个头中定义的非类,非协议types。 要引用协议和类,请使用@class@protocol将其声明为@class ClassFromOtherHeader;

其他#import应该在您的实施。 我的build议是根据这些规则开始将所有#import语句从头文件移动到实现文件中。 从您认为是问题根源的文件开始,向外移动。 这将解决您的问题,并为您提供更清晰的代码和更快的构build时间的副作用。

对于我来说,上述答案都没有帮助, 这里给出的答案也没有起作用。

什么修复它是closuresXcode,去〜/库/开发/ Xcode / DerivedData和删除所有与该项目相关的派生数据。 之后,我重新开放了这个项目,工作正常。

希望帮助别人!

就我而言,所提到的解决scheme都没有解决这个问题。 Xcode报告了我在Swift中重写的类的重复接口。 不知怎的,它不停地在Objective-C头文件中为项目中没有直接引用的类。

我打开terminal, cd进入项目目录,然后运行以下命令来grep -nr ProblemClassName.h .包含类头文件的所有文件: grep -nr ProblemClassName.h .

事实certificate,桥头包括一个甚至没有在项目导航器中引用过时的文件。 这又导入了Xcode错误中引用的头文件,这些文件也没有包含在Xcode项目导航器中。 现在我知道不仅仅依靠Xcode项目导航器来查看错误引用的文件。

tl; dr仔细检查桥接头,以确保所有在那里导入的文件都应该在那里,而不是导入头文件,然后导入问题头文件。

我发现一个项目有一个子项目,而不是用正确的语法在子项目中引用包含:

 #import <SubProject/Filename.h> 

它直接导入它们

 #import <Filename.h> 

这是唯一可能的,因为子项目的path被包含在主项目的“标题searchpath”中 – 这是做生意的错误方式。 所以我从那里删除了它。 子项目应该在“构build阶段 – 复制文件”部分(实际上已经发生)中复制需要包含的文件,并且应该使用使用Subproject / Filename.h语法的正确导入forms。

Fwiw我开始看起来是随机的 – 对我来说,解决的办法是做Product->Clean ,它神奇地消失了。

对于我来说,我忘了在m文件中的接口定义中包含括号。