类“Resources.h”的重复接口定义

Posted

技术标签:

【中文标题】类“Resources.h”的重复接口定义【英文标题】:Duplicate interface definition for class 'Resources.h' 【发布时间】:2020-10-27 13:42:58 【问题描述】:

由于安全原因无法粘贴原始代码,因此尝试更加完整

    有一个名为 Utils.xcodeproj 的项目,该项目有一个名为 Resources.m 的目标 c 文件,其标头公开为公共标头。 拥有另一个名为 main.xcodeproj 的项目,其中引用了此 Utils 项目。

现在在编译 main.xcodeproj 时出现错误“类资源的接口定义重复”ios/Utils/Utils/Resources.h:23:1: @interface Resources : NSObject

Build/Products/Debug-iphoneos/include/Utils/Resources.h:23:12: 注意:之前的定义在这里@interface Resources: NSObject

有没有办法克服这个错误或把这个错误变成警告?

Class Resources.h

@protocol ResourcesDelegate;

@interface Resources : NSObject

@property (weak, nonatomic) id<ResourcesDelegate> delegate;
+ (void) setDefault:(UIView *)view;
@end


@protocol ResourcesDelegate <NSObject>
@required
- (void)loadFromSDK:(NSString*)Name;

@end



Class Utils-Bridging-Header.h
#import "Resources.h"

Class XYZ in main.xcodeproj
#import "Utils/Resources.h"

[Resources setDefault:view]

【问题讨论】:

可能是导入问题,例如,在 A 中,您导入 B 和 C。在 B 中,您导入 C,因此 A 以 C 的两个定义结束。也许,也许不是......但你可以解决这个问题如下。在 B 中使用@class C;。这将定义一个名为 C(在 B 中)的类,但实际上并未给出定义。这取决于您的设置,您需要找出重复发生的位置,并将#import 替换为@class 以防止它发生。这是一个猜测 - 可能是您确实复制了文件并编译了两次,或者甚至您有两个资源,一个在主项目中,一个在另一个项目中...... ... ps... 解决这么模糊的事情当然很难,但至少这些是您可以尝试的事情...但是有件事告诉我您很坚持...跨度> 【参考方案1】:

你也可以..

#ifndef Resources_h
#define Resources_h

// ... your #import or @import, #include <...> rules here...

// ... announcing a 
// @class SomeClassWithName
// here if needed. This will make SomeClassWithName available
// to this header even if its interface is declared later on. (skaak's solution)

// ... all your @interface stuff here ...

#endif

这应该可以防止每个项目实施两次。

为什么会这样? 因为一旦 #import "Resources.h" 完成,就会定义 Resources_h,而在处理 #import "Utils/Resources.h" 时,定义会跳过第二次声明类的尝试。

编辑 忘了提到这种方法当然应该在头文件中使用。虽然不禁止在实现文件中使用它。事实上,在跨平台源代码中你会看到它被大量使用。

编辑2 看看以下很好的解释答案当使用 #include 时发生了什么以及使用 #import sven's *** answer 时应该如何正常工作

所以#import 预处理器命令提醒已经导入的文件,但是当文件及其声明从另一个具有自己的文件夹结构的项目重新建立时,这似乎失败了。简而言之:"Resources.h""Utils/Resources.h" 是预处理器的不同文件,因此您的类定义彼此重复。

【讨论】:

无论如何,回到正题......这是使用 include 时防止重复的旧 C 方法...... import 没有给你开箱即用? 好的,回复你的下一条评论……也许我可以穿越(所以我没有赢,我在作弊……或者我只是在清理)……是的,这些问题一直在增加... FWIW 我创建了 A 类和 B 类并试图破坏系统。所以主要进口 A 和 B 和 A 进口 B 例如我必须非常努力地打破它,并且只能通过包含来做到这一点。即使我确实导入并在其下方包含完全相同的内容,也没有麻烦。包含必须是第一个打破它。至少在最新的 Xcode 中看起来很健壮。 我认为当预编译器没有得到从不同目录的两个导入给出的一个类声明是同一个文件时,麻烦就开始了。这是#ifndef 可以很好地规避的。 在此处遵循我自己的 Edit2 #include 会使问题变得更糟,因为它只是将文件内容复制到适当的位置,并且复制更容易,所以不用再想知道为什么几乎所有框架都有这些 #ifndef 规则在顶部。

以上是关于类“Resources.h”的重复接口定义的主要内容,如果未能解决你的问题,请参考以下文章

类'RCTViewManager'XCode的重复接口定义

类 Parse 的重复接口定义

类“PFFacebookUtils”的重复接口定义 - IOS

Objective-C中接口和类定义之间的关系[重复]

阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第2节 抽象类_9_接口的私有方法定义

请写出至少5个JDK已定义好的接口,并说明它们都有啥作用。