27
votes

I have a project with mixed Swift and Objective-C in Xcode 8 that uses the generated "ModuleName-Swift.h" header file to import swift into Objective-c classes, but the preprocessor is not able to find the generated header file and throws an error on the import.

"Lexical or Preprocessor issue : 'ModuleName-Swift.h file not found'"

enter image description here

The project compiles just fine, but the preprocessor throws errors for the header not being found and for any Swift classes called inside the class there is no syntax highlighting or code completion. It's a struggle working with Swift classes in Objective-c that are unrecognized by Xcode 8, but yet compile just fine.

Any ideas on how to appease the preprocessor in Xcode 8?

5
I'm having the same issue. I noticed in the main project file, the generated header file was named differently than in Xcode 7. So I updated it appropriately and was able to compile. I still haven't figured out how to get the intelisense to work properly.glycerin

5 Answers

25
votes

I had exactly the same issue. Found the solution after adding a new file aiming to only one target (by mistake) and noticing that it had no problem reading the Swift classes. So, if you have multiple targets, and since the migration you didn't have the need to build and run them, suggest you to do that.

5
votes

Have this problem when we have multiple targets. If the Objective-c Generated Interface Header Name variable in Swift compiler of newly created targets is different than the original target's value. Change it to the same value with original target. See the following:

change, newtargetname-Swift.h to originaltargetname-Swift.h for new target

enter image description here

4
votes

To fix this issue Xcode 9.2, After long research i came to known my "Objective-c Generated Interface Header Name" is named after Product Name "productname-Swift.h"enter image description here

1
votes

You need to add this in your build settings.

There might be an issue while migrating to Xcode 8, where you will have unspecified in the build setting Swift header file.

This if from killerz

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"

1
votes

If

  • your product's normal targets run fine, but
  • you get the error when running your test targets…

note that each target uses (and should use) a different filename for the Objective-C Generated Interface Header Name.

This means you cannot import the generated header file in your Objective-C .h files, because they won't be found in the test target:

screenshot of import error when using .h file

Instead, you should move these #import statements into your Objective-C .m (implementation files), where they'll build successfully.


If you need to refer to Swift classes in a .h file, use the @class directive, e.g.:

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

#import <UIKit/UIKit.h>

@class SomeSwiftClass;

@interface ViewController : UIViewController

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

@end