在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
Swift.h 项目
#if __has_attribute(noreturn)
# define SWIFT_NORETURN __attribute__((noreturn))
#else
# define SWIFT_NORETURN
#endif
和能见度。h
#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
或者:
#if __has_attribute(noreturn) && !defined(SWIFT_NORETURN)
#define SWIFT_NORETURN __attribute__((__noreturn__))
#else
#define SWIFT_NORETURN
#endif
尝试检查头文件是否不包括行#import "Project-Swift.h"
。理想情况下,只有*.m
文件应该包含此生成的头。
https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c