在objective-c中导入swift类,找不到<myModule> -Swift.h文件

我有一个用Objective-C编写的iOS项目。 我在项目中创build了一个Swift类,在Swift中访问objective-c的桥接头文件已经成功生成,并且工作正常。

我的问题是相反的。 我想在Objective-C代码中导入Swift类。

在xcode中, 目标 – >构build设置 – > 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


  1. 构build设置 – > Objective-C生成的接口标题名称
    并将值设置为YourModule-Swift.h(这通常已经设置,这是您需要导入.m文件#import "YourModule-Swift.h"

  2. 转到生成设置并search“定义模块”,将两个值都设置为YES

  3. 例如,用@objc前缀在swift中创build一个类
    @objc class mySwiftClass{...}

  4. 转到窗口 – >项目,然后按“派生数据”上的删除button

  5. 再次build立该项目

  6. 现在应该工作。

为什么要添加@objc?

Swift类或协议必须使用@objc属性标记为可在Objective-C中访问和使用。

这个@objc前缀告诉编译器生成一个头文件给你的swift类。 它会将它添加到“MyModule-Swift.h”文件中,例如:

 @objc class MyCustomViewController : UIViewController {..} 

会生成这样的代码:

 SWIFT_CLASS("_TtC10MyCustomViewController4ViewController") @interface ViewController : UIViewController - (void)viewDidLoad; - (void)viewDidAppear:(BOOL)animated; - (void)didReceiveMemoryWarning; - (SWIFT_NULLABILITY(nonnull) instancetype)initWithNibName:(NSString * __nullable)nibNameOrNil bundle:(NSBundle * __nullable)nibBundleOrNil OBJC_DESIGNATED_INITIALIZER; - (SWIFT_NULLABILITY(nonnull) instancetype)initWithCoder:(NSCoder * __nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER; @end 

允许Objective-C知道这个类。

OMG ..实际的导入语句不是“class-Swift.h”,而是“projectname-Swift.h”

如果您在构build设置 – > Swift编译器代码生成 – > Objective-C生成的接口标题名称下查找,可以find该文件的名称

当我将Swift源文件拖入GUI时,文件没有生成。 只有当我右键单击 – >添加文件到“项目”。 然后它要求生成头文件。

对我来说,问题是我有bitcode。 当我点击“更新到推荐的项目设置”,它改变了一些可能是罪魁祸首的设置。 我在“生成设置”中将“已启用位代码”设置为“否”,现在已经修复。

在这里输入图像说明

我的除了丹尼尔克罗姆斯答案:

  • 切勿将-Swift.h标题添加到标题。 即使它似乎工作。 仅将导入添加到.m文件!

  • 如果你在你的头文件中使用swift类,在你的@interface之前用@class swiftclassname做一个前向声明

然后你会看到你的代码中真正的错误。

我昨天遇到同样的问题,工作了几个小时,无济于事。 其他人可能和我一样。我做了上述所有步骤,但没有任何成效。

破坏的原因是因为项目名称工件遍布我的项目(从以前更改其名称不正确)。

如果所有上述步骤都失败了,我会build议像我一样做,并重命名您的项目,以便Xcode可以重置一些东西…这解决了我的问题。 这样做就像一个魅力!

我已经堆叠了很长一段时间了。 在我的情况下,我的目标名称是像“我的应用程序”使用破折号作为目标名称的一部分。 我试图#import "my-app-Swift.h" ,但Xcode不断给我错误。

我挖掘“DerivedData”文件夹下,我发现“my_app-Swift.h”。 所以如果你使用一些有趣的字符作为目标名字。 您可以尝试用下划线_replace那些。