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

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

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

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

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


当前回答

好的,这些都是你真正需要的东西!

1.删除您添加的所有swift文件,并编译代码,没有任何错误。

----------

----------

2.转到“Projects”构建设置,并设置产品模块名称。 项目必须具有不包括空格的产品模块名称。

----------

----------

3.“定义模块”必须在“生成设置”中,在“打包”下,在项目中设置为“是”,而不是“目标”!

----------

----------

4.现在创建一个swift文件或视图控制器,在file-> newFile->中

----------

----------

它会请求创建一个桥接头,允许它创建一个桥接头。 如果你拒绝了一次,你必须手动添加一个-Bridging-Header.h

5.在控制器中添加@objc,告诉编译器有一些swift文件需要暴露给objecvec

----------

----------

6.构建项目并在任何objective - c控制器中导入#import "-Swift.h",它就可以工作了!你可以Command-click它来查看实际的文件!

----------

----------

希望这能有所帮助!

其他回答

唯一重要的是:*

在目标中使用定义的“产品模块名”,后跟-Swift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

无论“定义模块”参数设置为“是”或“否”,或“产品模块名称”项目未设置。

提醒:Swift类必须派生自NSObject或被标记为@objc属性,以便暴露给ObjectiveC / Foundation || Cocoa…

我有一个类似的问题,发现你只能添加

#进口“ProductModuleName-Swift.h”

到obj-c .m文件,而不是找到伞头的.h文件

附议很多人在这里,但增加一个相关的屏幕截图。Swift和Obj-C代码当然可以共存。这不是全有或全无的游戏。

要在Objective-C中访问Swift文件,你所需要做的就是将这个调用添加到你的Obj-C文件中(在.m /实现文件中):

#import "{product_module_name}-Swift.h"

(其中{product_module_name}表示项目的产品模块名称)。而不是尝试猜测你的产品模块名称或找出带有空格和特殊字符的角落案例,只需进入项目中的构建设置选项卡并键入“产品模块名称”-检查器将显示给你。我的经历是我没有预料到的。如果你感到困惑,可以看看这个屏幕截图。

为了让Obj-c代码在Swift中工作,你只需要添加一个桥接头文件,并导入相关的Obj-c头文件。

只是提醒那些在项目名称中使用“。”的人。对于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

我想再补充一个你可能会发现问题的原因——我正在创建一个混合了Swift和Objective-C代码的框架。我无法在框架外导入Swift类-我检查了-Swift.h文件,它正在生成但为空。

问题变得非常非常简单——我没有将我的任何Swift类声明为public!一旦我将public关键字添加到类中,我就可以从框架内外的类中使用它们了。

同样值得注意的是,在框架内(只有在。m文件内,另一个答案提到),我必须导入-Swift.h文件:

#import <FrameworkName/FrameworkName-Swift.h>