Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I add forward class references used in the -Swift.h header?

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:

  1. An Objective-C class called MyTableViewController
  2. An Objective-C class called 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?

like image 697
Bill Avatar asked Jun 07 '14 14:06

Bill


People also ask

Can you forward declare reference?

Can I forward declare them? Yes, but in that case you can only use a reference or a pointer to the forward-declared class.

Where do you put forward declarations?

Generally you would include forward declarations in a header file and then include that header file in the same way that iostream is included.

Do you put classes in header files?

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.

What is forward class declaration in C++?

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 };


2 Answers

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.

like image 184
johnboiles Avatar answered Sep 28 '22 09:09

johnboiles


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.

like image 38
jtbandes Avatar answered Sep 28 '22 11:09

jtbandes