I'm integrating Swift code into a large Objective-C project, but I'm running into problems when my Swift code refers to Objective-C classes. For example, suppose I have:
MyTableViewController
DeletionWorkflow
I declared a Swift class as follows:
class DeletionVC: MyTableViewController {
let deleteWorkflow: DeletionWorkflow
...
}
If I now try to use this class by importing ProjectName-Swift.h
into Objective-C code, I get undefined symbol errors for both MyTableViewController
and DeletionWorkflow
.
I can fix the problem in that individual source file by importing DeletionWorkflow.h
and MyTableViewController.h
before I import ProjectName-Swift.h
but this doesn't scale up to a large project where I want my Swift and Objective-C to interact often.
Is there a way to add forward class references to ProjectName-Swift.h
so that these errors don't occur when I try to use Swift classes from Objective-C code in my app?
Can I forward declare them? Yes, but in that case you can only use a reference or a pointer to the forward-declared class.
Generally you would include forward declarations in a header file and then include that header file in the same way that iostream is included.
Traditionally, the class definition is put in a header file of the same name as the class, and the member functions defined outside of the class are put in a . cpp file of the same name as the class.
In C++, Forward declarations are usually used for Classes. In this, the class is pre-defined before its use so that it can be called and used by other classes that are defined before this. Example: // Forward Declaration class A class A; // Definition of class A class A{ // Body };
You can create another header file that forward declares or imports the necessary classes, and then imports ProjectName-Swift.h
. For example, create a file named ProjectName-Swift-Fixed.h
with the contents:
// ProjectName-Swift-Fixed.h
// Forward declarations for property classes
@class DeletionWorkflow;
// Imports for superclasses
#import "MyTableViewController.h";
#import "ProjectName-Swift.h"
Then, instead of #import "ProjectName-Swift.h"
in your codebase, use #import "ProjectName-Swift-Fixed.h
.
This is a little silly, but it sounds like your "workaround" is what Apple intended, at least for now. From the interoperability guide:
If you use your own Objective-C types in your Swift code, make sure to import the Objective-C headers for those types prior to importing the Swift generated header into the Objective-C
.m
file you want to access the Swift code from.
In this devforums thread, someone mentioned they already filed a bug in Radar. You probably should too.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With