我最近一直在努力将Swift添加到一个现有的项目中,以便在现实世界中进行尝试。

在向项目中添加Swift源文件时,我对获得“桥接头”没有任何问题,也就是说,Objective-C到Swift。

但是*-Swift.h头文件应该公开Swift类,无论是标记为@objc的类还是ObjC类的子类,都找不到:-(

在我的主应用程序代码(仍然是Objective-C)中,我没有看到任何关于如何使用我的新子类的具体说明,用Swift编写。

我是首席开发人员的应用程序有一个相当大的代码库(70.000行),所以一次性过渡它是不可能的。


当前回答

我不得不从我的Objective C项目中删除WatchOS2 swift代码。在那之后XCode才提供生成-Swift.h

其他回答

只是提醒那些在项目名称中使用“。”的人。对于Swift版本的桥接头文件,Xcode将用下划线“_”替换“。”。奇怪的是,生成的Bridging-Header.h不会用下划线替换句点。

例如,一个名为My的项目。项目将具有以下桥接头文件名。

Bridging-Header.h(自动生成)

My.Project-Bridging-Header.h

Swift.h

My_Project.h

我希望这能帮助那些像我一样用了大姨妈却被困住的人。该文件可以在以下位置找到。

麦金塔HD / \用户/用户/ Library /开发商Xcode DerivedData /我。Project-fntdulwpbhbbzdbyrkhanemcrfil /构建/ Intermediates构建Debug-iphonesimulator /我的项目。项目构建- DerivedSources。

当心

Jon

如果Xcode实际上生成了你的-Swift.h头(在DerivedData的深处),但它没有引用你的Swift类,请确保你也定义了一个桥接头。我阅读文档的方式暗示我只需要从Swift调用Objective-C,但似乎从Objective-C调用Swift也是必要的。

请看我的回答:https://stackoverflow.com/a/27972946/337392

编辑:这是因为公共和内部访问修改器,正如我最终在苹果文档中发现的解释:-

默认情况下,生成的头包含Swift接口 用公共修饰符标记的声明。它还包含了 如果你的应用目标有 Objective-C桥接头。

文件正在生成,但Xcode无法找到它(我使用Lou Zell的答案来证明它正在生成)。

这是我对混合ObjC/Swift框架的修复(Xcode 9.2):

通过在finder (TargetName-Swift.h)中搜索,在DerivedData中找到预期生成的文件 拖到你的项目在XCode和UNCHECK复制文件。 点击XCode中的文件,打开文件检查器(右边面板的第一个选项卡)。 将位置从相对于组更改为相对于构建产品

前两个步骤应该可以让你很好地构建和使用你的项目,但最后两个步骤允许它在其他计算机上工作(即在团队项目中协作时仍然可以工作)。

文件名的前面总是您的目标名称。它被称为产品名称,但实际上它是目标名称。 因此,如果你想为一个新目标构建它,准备好期待that_target-Swift.h文件。

一种处理方法是

为每个目标添加一个预处理器,它是目标本身的名称(不带空格)。MY_TARGET = 1。将此添加到项目设置->构建设置->预处理器宏为每个目标。 如果您正在使用PCH文件,

在PCH文件中添加这些行

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

使用PCH文件的优点是您不必在任何地方都包含头文件。

如果您不使用PCH文件,只需在单个头文件中添加这些相同的行,并在需要使用swift类的任何地方包含该头文件。

这应该可以正常工作。

如果您正在使用Cocoapods之类的东西(并且在工作空间而不是项目中工作),请尝试在打开工作空间和构建之前打开项目并构建它。YMMV。