我在Xcode 8中有一个混合了Swift和Objective-C的项目,它使用生成的" ModuleName-Swift.h"用于将swift导入Objective-c类的头文件,但预处理器无法找到生成的头文件并在导入时抛出错误。
"词法或预处理器问题:'未找到ModuleName-Swift.h文件'"
项目编译得很好,但预处理器会为找不到的标头抛出错误,对于在类中调用的任何Swift类,没有语法高亮或代码完成。使用Objective-c中的Swift类很难解决Xcode 8无法识别的问题,但编译得很好。
关于如何在Xcode 8中安抚预处理器的任何想法?
答案 0 :(得分:25)
我有完全相同的问题。添加一个仅针对一个目标的新文件(错误地)后发现解决方案,并注意到读取Swift类没有问题。因此,如果您有多个目标,并且由于迁移您不需要构建和运行它们,建议您这样做。
答案 1 :(得分:5)
当我们有多个目标时遇到此问题。如果新创建的目标的Swift编译器中的 Objective-c Generated Interface Header Name 变量与原始目标的值不同。将其更改为与原始目标相同的值。请参阅以下内容:
将新目标的 newtargetname-Swift.h 更改为 originaltargetname-Swift.h
答案 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
文件中导入生成的头文件,因为它们无法在测试目标中找到:
相反,您应该将这些#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