我最近一直在努力将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它来查看实际的文件!

----------

----------

希望这能有所帮助!

其他回答

你必须在Objective-C类中导入一个头文件,它是:

#import “ProductModuleName-Swift.h”

它是自动生成的,在引用中它说:“目标中的任何Swift文件都将在包含此import语句的Objective-C .m文件中可见。”

这个答案解决了你可能已经有一些Objective-C代码调用Swift类,然后你开始收到这个错误的用例。

如何解决问题

接下来的步骤最终为我解决了所有问题。我在上面读到有人提到“鸡和蛋”,正是这个概念让我想到了这个过程。这个显式的过程表明,在生成头文件之前,必须删除任何引用Swift类的Objective-C代码。

Comment out the #import "ProductModuleName-Swift.h" statement in your Objective-C implementation file Comment out any references in the Objective-C implementation file to Swift Classes Clean & Build Resolve all errors/warnings Remove the comment on the #import "ProductModuleName-Swift.h" statement Clean & build (successfully or fix any remaining errors, verify that you are not referencing any Swift classes in Objective-C at this point. If so temporarily comment these out) Verify that "ProductModuleName-Swift.h" is generated by Cmd-Clicking on the class name of the #import "ProductModuleName-Swift.h" statement Remove the comment on the code referencing Swift classes in the Objective-C implementation file. Clean & Build as normal (the "ProductModuleName-Swift.h" should be generated and your Objective-C code referencing Swift Classes can be used as normal)

注意:在执行此过程时,关于将空格更改为下划线和将定义模块更改为YES的答案仍然适用,正如Apple文档中指定的规则一样。

桥接头路径

在一个错误中,在构建过程中没有找到文件ProductModuleName-Bridging-Header.h。这一事实产生了一个错误

< unknown>:0:错误:桥接头 “/Users/Shared/Working/abc/abc- bridging - header .h”不存在

对错误的进一步检查表明,该文件永远不会存在于所描述的位置,因为它实际上位于(错误的路径)

' /用户/共享/工作/ abc / abc / abc-Bridging-Header.h’。快速搜索目标/项目构建设置,手动进行更正,abc-Swift.h文件再次自动生成。

唯一重要的是:*

在目标中使用定义的“产品模块名”,后跟-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…

请允许我分享我在一个旧的objc项目中尝试使用Swift的经验。我不需要将定义模块设置为YES。

在我的情况下,我需要手动确保有一个objc桥接头。在我的构建设置中只出现了生成的接口头名称。

这导致生成了一个MyApp-Swift.h文件,但没有任何Swift类的痕迹。

苹果文档说,当你添加你的第一个swift文件时,会提示你创建一个桥接头。我没有。我手动添加了一个MyApp-Bridging-header.h文件,并在“Objective-C Bridging Header”字段中指向它。这使得我的MyApp-Swift.h文件被我的Swift类填充。

文档:将Swift导入Objective-C

项目必须有一个不包括空格的模块名。 “定义模块”必须在“生成设置”中的“打包”下设置为“是”。 注释掉了#import语句:

如果您在导入“ProductModuleName-Swift.h”时仍然有错误,那么

/ / #进口“ProductModuleName-Swift.h”

这显示了我的Swift代码中的一堆其他错误。

一旦我修复了这些新的错误,并成功地获得了源代码构建,我取消了#import的注释,没错!头文件被创建并正确导入:)