在Objective-C中导入Swift类,<myModule>-Swift.h文件找不到。

45

我有一个使用Objective-C编写的iOS项目。在项目中,我创建了一个Swift类,并成功生成连接Objective-C和Swift的桥接头文件,一切工作正常。

我的问题是如何在Objective-C代码中导入Swift类。

在Xcode中的目标 -> 构建设置 --> Swift编译器部分,我看到了Objective-C Generated Interface Header Name字段,它的值为myModule-Swift.h,但是当我在Objective-C类中导入此头文件时:

#import "myModule-Swift.h"

我遇到了编译器错误:

myModule-Swift.h file not found

在项目中,我也找不到这个文件。我该如何解决这个问题?

我的Xcode版本是6.4。


什么是类?我没有显示任何类。myModule-Swift.h 是 Xcode 应该生成的头文件。 - user842225
11个回答

88

更新于2018年5月 Xcode 9.3


  1. 构建设置 -> Objective-C 生成接口头文件名称,将值设置为 YourModule-Swift.h (通常已经设置好了,这是您需要在 .m 文件中导入的文件名 #import "YourModule-Swift.h")。

(例如,项目命名为 CData)

Example

  1. 与步骤1相同,进入构建设置并搜索“定义模块”,将两个值都设置为YES

  2. 创建一个继承 NSObject 的类,保存在 .swift 文件中

Example

  1. 再次构建项目

  2. 在 .m 文件中导入 YourModule-Swift.h 文件(请注意其大小写敏感,Mymodule !== MyModule)

enter image description here


1
请问您能解释一下 @objc 前缀的作用吗? - user842225
顺便提一下,我添加了1.5步骤,马上会解释。 - Daniel Krom
我想补充一下,如果你使用版本控制(我的情况下是 Git),并切换到一个只包含 Objective C 代码的分支,然后再返回 ObjC/Swift 应用程序,MyProject-Swift.h 文件将被破坏,并且除非你删除所有 Swift 文件、删除 Derived Data 并重新添加 Swift 文件,否则不会再次创建。非常令人恼火。 - Kevin_TA
也许这就是发生在我身上的事情,@Kevin_TA!全部删除?天啊。 - eric
2
@MarMass 是的,这个答案已经过时了,在 Swift 2.0 之前,你必须使用 @objc 或继承自 NSObject(顺便说一下,UIViewController 也继承自 NSObject),现在对于 @objc,你必须继承自 NSObject - Daniel Krom
显示剩余2条评论

21

如果有人想知道为什么在解决此问题上花费了几个小时后仍未解决,可能你正处于类似我的情况,我实际上是在开发一个框架而不是一个应用程序。

在这种情况下,Objective-C生成的接口头文件的导入语句格式如下:


#import <ModuleName/ModuleName-Swift.h>

1
谢谢你! - Assaf Gamliel
对我没用。更加恼人的是,我在同一个该死的代码库中看到其他使用这个语法、有相同目标等的示例。真他妈的恼人。 - Adrian
1
谢谢。这节省了我大量的时间。 - Brian Boyle

9

天啊.. 实际的导入语句不是 "class-Swift.h" 而是 "projectname-Swift.h"

如果你查看构建设置 -> Swift编译器代码生成 -> Objective-C生成接口头文件名称,你就能找到文件名

当我拖拽Swift源码到GUI时,文件没有被生成。只有在我右键点击->添加文件到“项目”时才会要求生成头文件。


只需在Objective-C文件中导入"ourprojectname-Swift.h"即可。 - Nagarjun
你可以在目标构建设置 -> 产品模块名称下看到它应该是什么。它可能不会自动成为项目/目标的名称。 - Louis Cremen

5

我对Daniel Krom的回答有所补充:

  • 千万不要将-Swift.h头文件添加到头文件中,即使看起来似乎可以。只在.m文件中添加导入!

  • 如果您的头文件中使用了swift类,请在@interface之前使用@class swiftclassname进行前向声明。

这样,您就可以看到代码中真正的错误了。


1
如果我需要在头文件中使用Swift枚举,该怎么办? - AlexW
@AlexW 你需要将它移动到 .m 文件中。 - Abuzar Amin

3
对我来说,问题在于我启用了位码。当我点击“更新为推荐的项目设置”时,它改变了一些设置,可能是罪魁祸首。我在构建设置中将“启用位码”更改为“否”,现在已经解决了。
请参考以下截图: enter image description here

1
我有一段时间被这个问题困扰。在我的情况下,我的目标名称是类似于“my-app”的名称,使用破折号作为目标名称的一部分。我尝试了#import "my-app-Swift.h",但Xcode一直给我报错。
我查找了“DerivedData”文件夹,找到了“my_app-Swift.h”。所以,如果您的目标名称中使用了一些有趣的字符,您可以尝试将它们替换为下划线_

0
对我来说,解决方案是创建一个新的目标。由于某种未知原因,我之前的目标没有“Swift编译器 - 通用”设置,因此也没有“Objective-C生成接口头文件名称”字段。在项目中指定该字段是不够的。

0
在我的情况下,我忘记将一个 Swift 框架检查到我正在使用它的目标/类中,这是一个非常具体的情况,但它可能会帮助未来的某个人。

0

我昨天遇到了同样的问题,花了几个小时来解决它,但是没有用。其他人可能也会遇到同样的困境。我按照上面描述的所有步骤做了,但都没用。

我的问题是由于项目名称中有许多残留物(之前不正确更改名称)导致的。

如果所有上述步骤都失败了,我建议像我一样重命名你的项目,这样Xcode就可以重置某些内容...这对我解决了问题。这样做非常顺利!


0

这不是一个确切的答案,而是一种解决方法,但在某些困难情况下可以节省您的时间。如果您像一些先前的答案建议的那样,实际上可以在派生数据文件夹中找到Swift头文件,则可以使用完整路径导入它。这不仅适用于Swift头文件,而且适用于任何头文件。希望您能发现这个答案有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接