2016-06-14 8 views
0

Ich habe eine C++ - Header-Datei (mit dem Namen header.h), die ich in meinem Swift-Projekt aufnehmen möchte.Include C++ Header-Datei in Swift

Da das C++ - Framework, das ich einfügen möchte, noch nicht fertig ist, habe ich nur die Header-Datei für jetzt.

sieht mein C++ Header-Datei header.h ein wenig wie folgt aus:

#include <vector> 

struct someStruct{ 
    float someAttr; 
} 

class someClass{ 
    public: 
     enum SomeEnum{ 
      Option1, 
      Option2 
     } 

     void someFunc(const double value) {} 
} 

Problem ist, wenn ich versuche, die header.h Datei im project-Bridging-Header.h es Vektor finden nie einschließen, die ich in header.h umfassen

'vector' file not found

ich versuchte header.h zu header.hpp umbenennen. Ich habe versucht, die Bridging-Header Typ auf C++ Header im rechten Bereich festlegen. Aber keiner von ihnen half.

Ich hoffe, dass einige von Ihnen mir helfen können herauszufinden, was ich falsch mache.

+0

Haben Sie versucht [dies] (http://www.swiftprogrammer.info/swift_call_cpp.html)? – Dershowitz123

+0

Ich habe versucht, einen Wrapper hinzuzufügen, obwohl dies zu einem Verlust in Klassen führen würde, die ich in Swift Code – ferdyyy

+0

verwenden kann Überprüfen Sie diese Antwort http://StackOverflow.com/a/24202940/4700426, hoffe dies hilft. :) –

Antwort

2

Leider ist es nicht möglich, eine C++ Klasse in Swift direkt zu verwenden, finden Sie https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216-CH2-ID0:

Sie nicht C++ Code direkt in Swift importieren. Erstellen Sie stattdessen einen Objective-C- oder C-Wrapper für C++ - Code.

Eigentlich ist eine bequeme Möglichkeit, C++ für Swift zu verwenden, Objective-C++. Objective-C++ - Quelldateien können sowohl Objective-C- als auch C++ - Code gemischt enthalten. Hier ist ein kurzes Teilbeispiel basierend auf dem Code-Snippet in Ihrer Frage. Nur someClass ist hier teilweise eingepackt. Im Produktionscode müssten Sie auch die Speicherverwaltung berücksichtigen.

Die Header-Datei der Wrapper, mywrapper.h, hat keine Spuren von C++:

#ifndef mywrapper_h 
#define mywrapper_h 

#import <Foundation/Foundation.h> 

// This is a wrapper Objective-C++ class around the C++ class 
@interface someClass_oc : NSObject 

-(void)someFunc:(double)value; 

@end 

#endif /* mywrapper_h */ 

ist die Objective-C++ Implementierung mywrapper.mm. Bitte beachten Sie die .mm Erweiterung. Sie können eine Objective-C-Datei mit einer .m erstellen und dann umbenennen.

#import "mywrapper.h" 
    #import "header.h" // CAN import a C++ header here, in Objective-C++ code 

    // Use an extension on someClass_oc because we need to use someClass, 
    // but we couldn't do it in mywrapper.h, 
    // which is visible from Swift and thus can't contain C++ stuff. 
    @interface someClass_oc() 
    { 
     someClass * ptrSomeClass; 
    } 
    @end 

    @implementation someClass_oc 

    -(id)init 
    { 
     // In this example ptrSomeClass is leaked... 
     ptrSomeClass = new someClass(); 
     return self; 
    } 

    -(void)someFunc:(double)value 
    { 
     ptrSomeClass->someFunc(value); 
    } 

    @end 

Jetzt können Sie mywrapper.h in dem Überbrückungs Header importieren und dann etwas tun, wie dies in Swift:

let x = someClass_oc() 

x.someFunc(123.456) 

So können Sie ein Objekt in Swift erstellen, die von einer Instanz des C unterstützt wird ++ Klasse.

Dies ist nur ein kurzes Beispiel, um Ihnen eine Idee zu geben. Wenn Sie auf andere Probleme stoßen, würden sie wahrscheinlich separate Fragen verdienen.

+0

danke für Ihre ausführliche Antwort. Ich muss wahrscheinlich die Klassen und ihre Funktion vollständig umschließen oder das Framework in swift umschreiben. – ferdyyy

Verwandte Themen