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

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

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

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

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


当前回答

文件名的前面总是您的目标名称。它被称为产品名称,但实际上它是目标名称。 因此,如果你想为一个新目标构建它,准备好期待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类的任何地方包含该头文件。

这应该可以正常工作。

其他回答

我发现了一个对我很管用的小窍门。

Create your #import "ProductModuleName-Swift.h" in your appDelegate.h file and in your ProductName-Prefix.pch file. If you don't have it in xcode 6 you can create it with this way Why isn't ProjectName-Prefix.pch created automatically in Xcode 6? Command+shift+k to clean your code, if you receive an error about your "ProductModuleName-Swift.h" delete it from appDelegate.h file. Clean your code again. Now everything will work like a charm If you receive again error about the "ProductModuleName-Swift.h", now create again in appDelegate.h file and clean your code again.

每次你收到这个错误的时候都要做这个工作(从appDelegate.h文件中删除并创建“ProductModuleName-Swift.h”,然后清理你的代码)来静音它。

这里是没有生成的moduleName-Swift.h的另一个变体。

我决定在我的项目中包含IOS图表,但不想将源代码混合在同一个目录中,所以我将图表项目文件夹放在我代码的项目文件夹旁边。我将图表项目拖到项目的导航栏中,并将框架包含在项目目标的“通用项目设置”的“嵌入式二进制文件”列表中,并在“构建选项”部分的“构建设置”选项卡中将“嵌入内容包含Swift代码”开关设置为“是”。

我的项目的moduleName-Swift.h文件永远不会生成,不管这里建议了什么其他开关或设置。最后,使用Lou Z的方法查找-Swift.h文件,我看到在我的项目的xcode Build目录Charts.framework/Headers/深处生成了一个Charts-Swift.h文件

使用Daniel Gindi的ios-charts Swift包而不包括项目源目录中的代码的解决方案是添加:

#import "Charts/Charts-Swift.h"

到记录项目数据的模块。

这可能是一个明显的点(也许太明显了),但是您必须在项目中至少有一个swift文件来生成头文件。如果您正在编写样板或配置代码,意图稍后编写swift,则导入将不起作用。

现在它起作用了。

项目必须具有不包括空格的产品模块名称。 “定义模块”必须在“生成设置”中的“打包”下设置为“是”。

最后的作品。感谢大家的帮助:-)

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