2017-04-04 2 views
2

Ich möchte eine App für iOS und Android native erstellen (ich habe Xamarin in der Vergangenheit verwendet und ich möchte es nicht mehr verwenden), meine nächste Wahl war es, gemeinsam genutzten Code in C++ zu schreiben, der kompiliert werden kann auf beiden Plattformen nativ.Kann ich C++ direkt von Swift verwenden?

Jetzt möchte ich wissen, ob ich C++ direkt von Swift verwenden kann. Die einzigen Lösungen, die ich gefunden habe, schlagen vor, einen Wrapper in Objective-C++ zu erstellen und dies durch einen Bridging-Header zu enthüllen, aber ich will diesen Overhead nicht.

Ist dies für Swift geplant? Oder gibt es andere Lösungen, um den Objective-C++ - Schritt zu überspringen?

+0

In Verbindung stehende http://stackoverflow.com/questions/24042774/can-i-mix-swift-with-c-like-the-objective-cmmfiles –

+0

Mögliche Duplikate von [Kann ich Swift mit C++ mischen ? Wie das Objective - C .mm files] (http://stackoverflow.com/questions/24042774/can-i-mix-swift-with-c-like-the-objective-cmmfiles) –

Antwort

0

Wenn Sie Ihre C++ - Header als C-kompatibel in die Bridging-Header.h einschließen, können Sie sie nahtlos in Ihrem schnellen Projekt verwenden.

#ifndef Bridging_Header_h 
#define Bridging_Header_h 

#import <Foundation/Foundation.h> 
#include "CPlusPlusHeader.h" 


#endif /* Bridging_Header_h */ 
+0

Was ist der Haken? ? Ich wusste nicht, dass das möglich ist. – vrwim

+0

Der Schlüssel besteht darin, einen Objective-C-Bridging-Header zu erstellen, der # C-kompatible C++ - Header enthält, die als C markiert sind und mit dem externen C-Trick kompatibel sind. – zero3nna

+2

Beachten Sie, dass Sie damit nur externe C-Funktionen aufrufen und C-kompatible Typen verwenden können. Sie können C++ - Klassen oder andere nicht C-kompatible Features von C++ nicht direkt verwenden. –

2

Das wird derzeit nicht unterstützt. Es gibt nur zwei Ansätze für das Gespräch C++ Code aus Swift Code:

  1. Wickeln Sie Ihren C++ Code in ObjC mit Objective-C++, wie Sie bereits gefunden.

  2. Nutzen Sie die Tatsache, dass C++ meistens mit C kompatibel ist, und Swift kann C aufrufen und einen C-Wrapper um Ihre C++ - Klassen schreiben und diesen von Swift verwenden. Ein gemeinsamer Ansatz wäre:

cppwrapper.h

struct MyCppClass; // In C++ class and struct are the same, so this looks like a C struct to C, and as long as you don't look inside it, you can use pointers to it in C code. 

extern "C" { // Tell C++ to turn off overloading based on type so it's C-compatible. 

struct MyCppClass* MyCppClass_new(int firstParam); 
void MyCppClass_delete(struct MyCppClass* inThis); 
void MyCppClass_setFirstParam(struct MyCppClass* inThis, int firstParam); 

} // extern "C" 

cppwrapper.cpp

#include "cppwrapper.h" 
#include "MyCppClass.hpp"  

extern "C" MyCppClass* MyCppClass_new(int firstParam) 
{ 
    return new MyCppClass(firstParam); 
} 

extern "C" void MyCppClass_delete(MyCppClass* inThis) 
{ 
    delete inThis; 
} 

extern "C" void MyCppClass_setFirstParam(struct MyCppClass* inThis, int firstParam) 
{ 
    inThis->SetFirstParam(firstParam); 
} 

Sie könnten dann sogar ein MyCppClassSwiftWrapper definieren, die eine Instanz-Variable vom Typ COpaquePointer hat, in denen Sie speichern das C++ - Objekt. Diese Klasse würde in ihrem Konstruktor MyCppClass_new in ihrem Konstruktor MyCppClass_delete aufrufen und würde einen Wrapper um MyCppClass_setFirstParam enthalten, der den COpaquePointer als den inThis Parameter in es verwendet.

Ich schrieb einmal ein (sehr primitives) Dienstprogramm, mit dem Sie C++ - Header markieren und einfache C- und Swift-Wrapper für sie automatisch generieren können (https://github.com/uliwitness/cpptoswift/), aber es funktioniert nicht mit Vorlagen und Sie müssen wahrscheinlich mehr hinzufügen type mappings zu ihm. Es behandelt auch noch nicht korrekt C++ - Objekte übergeben/zurückgeben.

Es gibt auch https://github.com/sandym/swiftpp/, die das alles besser macht, aber ich denke, es verwendet immer noch Objective-C unter der Haube für seine Wrapper, aber zumindest müssen Sie es nicht selbst schreiben.

Verwandte Themen