28

I've read a lot of questions and answers that deal with a similar issue, but I have yet to find a solution. If anyone could shed some light, that would be wonderful.

I created a Swift project and now I want to combine it with some Objective-C. My "failed to import bridging header" only occurs when I attempt to #import my Chartboost.h file. So, as long as I don't have anything in my bridging header file, Xcode finds it and gives me no issue. But once I add this:

#import <Chartboost/Chartboost.h>

I get the error along with 38 other errors saying "Swift Compiler Error - Function definition not allowed here".

I've correctly imported my framework. And my framework search path is correct. And it's only when I import the Chartboost framework. UIKit and Foundation work fine.

Here is what I did leading up to the issue....First, I created a new Obj-C file and then clicked "Yes when Xcode gave me a pop-up asking if it could configure a bridging header. This created "FunFacts-Bridging-Header.h"

Then I made sure Objective-C Bridging Header path was correct under Swift Compiler - Code Generation.

I even put in a very specific path /Users/me/Desktop/FunFacts/FunFacts-Bridging-Header.h and it still says "Failed to import".

I've also set Defines Module to "Yes" (because I heard that may help). And my product module name is FunFacts.

Why is FunFacts-Bridging-Header.h failing to import when I try to add #import ?

4

9 回答 9

41

我在另一篇文章中回答了这个问题:Chartboost 与 XCode 6.1 的集成问题

解释:

似乎某些 pod 和库不会打扰导入基本框架,因为他们希望您的代码已经拥有它们。这不适用于 Swift,因为导入框架的方式发生了变化。您需要做的就是在桥接头文件中添加所需的框架。

回答:

这取决于编译器抛出的错误。如果它抱怨NSObject,NSString等...您需要 #import <Foundation/Foundation.h>在桥接头文件的顶部添加。

如果它抱怨UIView,UIButton等...您需要#import <UIKit/UIKit.h>在桥接头文件的顶部添加。

于 2014-12-14T19:53:44.777 回答
17

我想出了2个解决方案!

1) 这不是最漂亮的方法,但我将 Chartboost.h 文件中的所有代码复制并粘贴到我的 Bridging-Header.h 文件中,而不是导入 . 这行得通。但我知道有更好的方法,所以我一直在寻找......

2)我相信,正确的解决方案是我接下来要做的。我的项目(非目标)框架搜索路径为空。因此,我继续添加 Chartboost SDK 的路径,如下所示: /Users/me/Desktop/Apps/SDKs/Chartboost
现在它可以毫无问题地构建和运行,我不必将所有内容复制并粘贴到桥接中标题。所需要的只是

#import <Chartboost/Chartboost.h>

如果有人遇到类似问题,请阅读我在问题中所做的事情,然后用这个答案跟进。

于 2014-09-30T18:54:13.687 回答
9

有一个几乎相同的问题,并找到了一个对我有用的解决方案。

我的问题是桥接头不在我的所有目标中。

项目桥接头


它在我的项目中,但不是我的 UnitTest 目标。所以我通过我的 UITest 和 UnitTest 添加它,它开始工作没有问题。

测试目标


于 2015-09-29T16:14:24.660 回答
6

像你这样的问题让我很困惑。但我找到了解决方案。

#import <Foundation/Foundation.h>

您应该将此代码 (↑) 放在您的代码之前。这只是我的解决方案(↓)。

#import <Foundation/Foundation.h>
#import <Chartboost/Chartboost.h>

祝你好运!

于 2014-12-14T03:25:46.127 回答
6

这就是我解决它的方法(并且有效!):

  1. 在项目的根目录下创建 yourProjectName-Bridging-Header.h 文件
  2. 在该文件中包含您想要公开并使用到您的 swift 项目中的类的 .h
  3. 转到您的项目->构建设置->搜索路径,并将“始终搜索用户路径”键设置为是。
  4. 将“用户标题搜索路径”设置为您的项目根路径。

而已。

显然,Xcode 在将第三方文件夹复制到您的项目时会丢失它们

我在 Xcode 6.3,swift 1.2。

于 2015-07-16T10:59:07.110 回答
4

答案真的很简单。

确保在目标部分而不是项目部分下的 SWIFT_OBJC_BRIDGING_HEADER 中添加桥接头路径。

于 2014-11-20T20:44:25.990 回答
4

如果您使用 CocoaPods,这可以节省您的时间。1)你需要做的第一件事是检查你的 Podfile 它会像:

target 'YourProjTests' do
    inherit! :search_paths
end

target 'YourProjUITests' do
    inherit! :search_paths
end

2) 打开 baseproj 配置并为测试目标设置正确的 Pods-Proj.debug ,见附图:在此处输入图像描述

于 2016-09-22T19:16:56.113 回答
2

如果您的桥接头中有这些行:

#ifndef Bridging_Header_h
#define Bridging_Header_h

#endif /* Bridging_Header_h */

把它们删掉,就可以解决Foundation和UIKit的问题了。

于 2016-04-19T14:22:52.973 回答
0

一种情况是,如果import <Chartboost+Extention/Chartboost+Extention.h>

正确的方法是import <Chartboost**_**Extention/Chartboost+Extention.h>

只是因为 Pod build 会将框架名Chartboost+Extention改为 intoChartboost_Extention

于 2016-04-20T07:25:10.207 回答