如何避免桥接标题中的"重新定义"和"重复协议"定义错误

Luc*_*sen 8 objective-c swift

我想在swift类中使用objc库和objc类.所以我将以下内容放在Bridging-Header.h中:

#import <FooLibrary/FooLibrary.h>
#import "FooClass.h"
Run Code Online (Sandbox Code Playgroud)

问题是FooClass.h有

#import "FooLibrary.h".
Run Code Online (Sandbox Code Playgroud)

因此,当我编译时,我得到了数百个错误,例如:"枚举器的重新定义"和"属性具有先前定义"和"重复协议定义"和"Typedef重新定义"

我该如何避免这种情况?看起来这只是我所拥有的一个愚蠢的心理障碍,但我无法超越它,所以我在这里问.

PartiallyFinite建议我留意 #include

我做了一个项目范围的搜索,而我根本没有使用它.图书馆里有一些.我选择了其中一个错误.装饰所在的文件永远不会包含在任何文件中#include

Gre*_*reg 10

听起来有些事情导致预处理器认为FooLibrary.h由第二个间接导入的标题在#import某种程度上与您在其上方所包含的文件不同.我最好的猜测,什么是你的第一个,框架式的进口会引用复制到构建过程中生成位置的头文件,而你的第二个,直接导入文件中引用的头文件,因为它是在你的项目目录,这意味着预处理器将它们视为两个完全独立的文件,导致它被导入两次.

建议的修复方法:

  1. 如果您可以包含FooClass.h使用框架样式的导入语法(如#import <FooLibrary/FooClass.h>),那么可能会解决问题.

  2. 如果您完全确定FooClass.h始终包含FooLibrary.h,您可以完全省略第一次导入,因为所有内容都将通过第二个间接导入.

  3. 否则,您可以尝试一些不错的,老式的包含警卫(假设您具有对库头的写入权限):

    // FooLibrary.h
    
    #pragma once // Maybe even throw in one of these for good measure;
                 // since we're dealing with an obscure-sounding bug,
                 // may as well try to fix it in all of the possible ways
    
    #ifndef FOOLIBRARY_IMPORTED
    #define FOOLIBRARY_IMPORTED
    ... // actual file contents
    #endif
    
    Run Code Online (Sandbox Code Playgroud)

    这将在第一次导入文件时定义预处理器宏,因此第二次预处理器尝试导入文件时,已定义的宏将阻止第二次导入内容.我不明白为什么#import在你的情况下没有做到这一点,因为这实际上是它唯一的目的和优势#include,但如果这个解决它,¯\ _(ツ)_ /¯