带有混合Swift和Objective-c项目的Xcode 8生成" ModuleName-Swift.h"标题未找到

时间:2016-09-23 19:56:22

标签: ios objective-c xcode xcode8

我在Xcode 8中有一个混合了Swift和Objective-C的项目,它使用生成的" ModuleName-Swift.h"用于将swift导入Objective-c类的头文件,但预处理器无法找到生成的头文件并在导入时抛出错误。

"词法或预处理器问题:'未找到ModuleName-Swift.h文件'"

enter image description here

项目编译得很好,但预处理器会为找不到的标头抛出错误,对于在类中调用的任何Swift类,没有语法高亮或代码完成。使用Objective-c中的Swift类很难解决Xcode 8无法识别的问题,但编译得很好。

关于如何在Xcode 8中安抚预处理器的任何想法?

5 个答案:

答案 0 :(得分:25)

我有完全相同的问题。添加一个仅针对一个目标的新文件(错误地)后发现解决方案,并注意到读取Swift类没有问题。因此,如果您有多个目标,并且由于迁移您不需要构建和运行它们,建议您这样做。

答案 1 :(得分:5)

当我们有多个目标时遇到此问题。如果新创建的目标的Swift编译器中的 Objective-c Generated Interface Header Name 变量与原始目标的值不同。将其更改为与原始目标相同的值。请参阅以下内容:

将新目标的 newtargetname-Swift.h 更改为 originaltargetname-Swift.h

enter image description here

答案 2 :(得分:2)

解决这个问题Xcode 9.2,经过长时间的研究后我发现我的“Objective-c Generated Interface Header Name”以产品名称“ productname-Swift.h ”命名{{3} }

答案 3 :(得分:1)

您需要在构建设置中添加此项。

迁移到Xcode 8时可能会出现问题,在构建设置Swift头文件中您将拥有unspecified

这来自killerz

  

转到   构建设置 - > Objective-C生成的接口标题名称   并将值设置为YourModule-Swift.h(这通常已设置,这是您需要在.m文件中导入的文件名#import“YourModule-Swift.h”

答案 4 :(得分:1)

如果

  • 您的产品的正常目标运行良好,但
  • 运行测试目标时出现错误...

请注意每个目标使用(并且应该使用)Objective-C生成的接口标题名称的不同文件名。

这意味着您无法在Objective-C .h文件中导入生成的头文件,因为它们无法在测试目标中找到:

screenshot of import error when using .h file

相反,您应该将这些#import语句移动到Objective-C .m(实现文件)中,以便他们成功构建。

如果您需要在.h文件use the @class directive中引用Swift类,例如:

//
//  ViewController.h
//  import-example
//

#import <UIKit/UIKit.h>

@class SomeSwiftClass;

@interface ViewController : UIViewController

- (NSString *) titleFromGenerator:(SomeSwiftClass *)generator;

@end