关于ios:Xcode 8与混合Swift和Objective-c项目生成的“ModuleName-Swift.h”标头未找到

Xcode 8 with mixed Swift and Objective-c project generated “ModuleName-Swift.h” header not found

我在Xcode 8中有一个混合了swift和objective-c的项目,它使用生成的"modulename swift.h"头文件将swift导入到objective-c类中,但是预处理器找不到生成的头文件并在导入时引发错误。

"词汇或预处理器问题:"找不到modulename swift.h文件'"

enter image description here

这个项目编译得很好,但是预处理器对没有找到的头和类内调用的任何Swift类抛出错误,没有语法高亮显示或代码完成。与Objective-C中的Swift类一起工作是一种困难,Xcode8无法识别这些类,但编译起来却很好。

关于如何安抚Xcode8中的预处理器有什么想法吗?


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


当我们有多个目标时,就有这个问题。如果新创建目标的swift编译器中的objective-c生成的接口头名称变量与原始目标的值不同。将其更改为与原始目标相同的值。请参见以下内容:

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

enter image description here


为了解决这个问题xcode 9.2,经过长时间的研究,我知道我的"objective-c生成的接口头名称"是以产品名"product name swift.h"enter image description here命名的。


如果

  • 你的产品的正常目标运行良好,但是
  • 运行测试目标时会出错…

注意,每个目标使用(并且应该使用)不同的文件名作为objective-c生成的接口头名称。

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

screenshot of import error when using .h file

相反,您应该将这些#import语句移动到目标C .m(实现文件)中,在那里它们将成功构建。

如果需要在.h文件中引用swift类,请使用@class指令,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//
//  ViewController.h
//  import-example
//

#import <UIKit/UIKit.h>

@class SomeSwiftClass;

@interface ViewController : UIViewController

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

@end


您需要将此添加到生成设置中。

迁移到Xcode8时可能会出现问题,在Xcode8中,构建设置swift头文件中将包含unspecified

如果来自基勒兹

Go to
Build Settings->Objective-C Generated Interface Header Name
and set the value to YourModule-Swift.h (this is usually already set, this is the filename you need to import on .m file #import"YourModule-Swift.h"