Ios ';斯威夫特·诺雷图恩';宏重新定义

Ios ';斯威夫特·诺雷图恩';宏重新定义,ios,swift,xcode,ios14,xcode12.5,Ios,Swift,Xcode,Ios14,Xcode12.5,在Xcode 12.5上,当我尝试编译我的测试目标时,我得到了以下结果: /Users/user/Development/project-ios/My ProjectTests/My ProjectTests-Bridging-Header.h:7:9: note: in file included from /Users/user/Development/project-ios/My ProjectTests/My ProjectTests-Bridging-Header.h:7: #impo

在Xcode 12.5上,当我尝试编译我的测试目标时,我得到了以下结果:

/Users/user/Development/project-ios/My ProjectTests/My ProjectTests-Bridging-Header.h:7:9: note: in file included from /Users/user/Development/project-ios/My ProjectTests/My ProjectTests-Bridging-Header.h:7:
#import "SpecHelper.h"
        ^
/Users/user/Development/project-ios/My ProjectTests/SpecHelper.h:36:9: note: in file included from /Users/user/Development/project-ios/My ProjectTests/SpecHelper.h:36:
#import "My_Project-Swift.h"
        ^
/Users/user/Library/Developer/Xcode/DerivedData/My._Project-eybfcywypdtewfbihzpxuwyltrxw/Build/Intermediates.noindex/My Project.build/Debug-iphonesimulator/My Project.build/DerivedSources/My_Project-Swift.h:98:10: error: 'SWIFT_NORETURN' macro redefined
# define SWIFT_NORETURN __attribute__((noreturn))
         ^
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator14.5.sdk/usr/lib/swift/shims/Visibility.h:86:9: note: previous definition is here
#define SWIFT_NORETURN __attribute__((__noreturn__))
        ^
<unknown>:0: error: failed to import bridging header '/Users/user/Development/project-ios/My ProjectTests/My ProjectTests-Bridging-Header.h'
Command MergeSwiftModule failed with a nonzero exit code
和能见度

#if __has_attribute(noreturn)
#define SWIFT_NORETURN __attribute__((__noreturn__))
#else
#define SWIFT_NORETURN
#endif
注意:这适用于Xcode 12.4

你知道怎么解决这个问题吗

更新(5月27日):如果我删除派生数据,运行测试套件,它将失败,并出现上述错误。第二次尝试运行它似乎有效。我不知道为什么会这样


更新2:(6月3日):问题似乎是我在一个.h文件中定义了一个类,它符合swift文件中定义的协议,不同的目标。解释为什么我不能使用前向声明,这样我就不必导入“MyProject Swift.h”文件。

我现在还不清楚为什么要在不同的地方声明宏,但必须有一个循环导入,或者它最终会被重新定义

选项1是重构代码,以便只在一个位置声明该宏,然后从必要的位置导入它

选项2是包装每个声明,以便它不会被重新定义:

#ifndef SWIFT_NORETURN

#if __has_attribute(noreturn)
#define SWIFT_NORETURN __attribute__((__noreturn__))
#else
#define SWIFT_NORETURN
#endif

#endif
或:


尝试检查头文件是否不包含行
#import“Project Swift.h”
。理想情况下,只有
*.m
文件应该包含这个生成的头


您是否尝试删除重新定义?请参见下文@EmilioPelaez,我不是自己添加定义,而是将一个定义生成到“My Project.swift”文件中,另一个定义似乎是模拟器的“./shimes/Visibility.h”文件中的“垫片”。我无法更改我相信的。抱歉耽搁了。是的,我想这是一个循环进口,但我没有明确声明,这意味着我将无法检查它的存在。项目目标导入到
SpecHelper.h
文件中:“#导入”My_project-Swift.h“这最终与
Visibility.h
中定义的冲突。我想这两个我都无法更改。谢谢@ZGI6YXNt的提示。我认为我的问题是在.h文件中有一个类,它符合swift文件中定义的协议,不同的目标。我试图通过向前声明协议来解决这个问题,但我认为这是不可能的,因为一致性需要由编译器验证,因此需要整个声明。有几种不同的方法可以解决这个问题,例如,您可以完全用swift重写这个类,或者只重写负责遵守协议的部分。如果由于某些原因不适合,还有其他选择。
#ifndef SWIFT_NORETURN

#if __has_attribute(noreturn)
#define SWIFT_NORETURN __attribute__((__noreturn__))
#else
#define SWIFT_NORETURN
#endif

#endif
#if __has_attribute(noreturn) && !defined(SWIFT_NORETURN)
#define SWIFT_NORETURN __attribute__((__noreturn__))
#else
#define SWIFT_NORETURN
#endif