Kann ich Swift mit C++ mischen? Wie die Objective-C .mm-Dateien

Lesezeit: 9 Minuten

Kann ich Swift mit C mischen Wie die Objective C mm Dateien
EhTd

Ich habe gerade meine .m-Dateien in .mm geändert und verwende C++. Gibt es eine Möglichkeit, dasselbe mit Swift zu tun?

Kann ich Swift mit C mischen Wie die Objective C mm Dateien
SwiftArchitect

Die Verwirrung kann von der Annahme herrühren, dass sich lediglich eine Dateierweiterung ändert .m zu .mm ist alles, was Sie brauchen, um die Sprachen zu überbrücken, obwohl es in Wirklichkeit nichts dergleichen tut. Es ist nicht die .mm das verursacht Reibung mit .cppes ist der .h Header, der definitiv kein a sein darf C++ Header.


Gleiches Projekt: Ja.

In dem gleich Projekt können Sie gerne mischen C, C++, Ziel c, Ziel C++, Schnellund selbst Montage.

  1. ...Bridging-Header.h: Sie aussetzen C, Ziel c und Objective-C++ zu Schnell über diese Brücke
  2. <ProductModuleName>-Swift.h: macht aus automatisch dein Schnell Klassen gekennzeichnet mit @objc zu Ziel c
  3. .h: Dies ist der schwierige Teil, da sie mehrdeutig für alle Geschmacksrichtungen verwendet werden C, ++ oder nicht, Zielsetzung oder nicht. Wenn ein .h enthält keine einzige C++ Stichwort, wie classes kann hinzugefügt werden ...Bridging-Header.hund wird die entsprechende Funktion verfügbar machen .c oder .cpp Funktionalitäten, die es deklariert. Andernfalls muss dieser Header entweder in eine pure C oder Ziel c API.

Gleiche Datei: Nein.

In dem gleich Datei, Sie können nicht alle 5 mischen. In der gleichen Quelldatei:

  1. .swift: Sie kippen mischen Schnell mit irgendetwas
  2. .m: Sie können mischen Ziel c mit C. (@Vinzz)
  3. .mm: Sie können mischen Ziel c mit C++. Diese Brücke ist Objective-C++. (@Vinzz).
  4. .c: rein C
  5. .cpp: Sie können mischen C++ & Montage (@Wertigkeit)
  6. .h: allgegenwärtig und mehrdeutig C, C++, Ziel c oder Objective-C++so lautet die Antwort es hängt davon ab, ob.

Verweise

  • Aufrufen der Assembly aus C++ (Brett Hale)
  • Swift von Objective-C aufrufen (Svitlana)
  • C, C++, Obj-C, Obj-C++ von Swift aufrufen (SwiftArchitect, selbst)
  • Um ein vollständiges iOS 9, Xcode 7-Projekt herunterzuladen, suchen Sie nach SO-32541268 in Swift-Rezepten.

  • Korrektur: Im gleichen .m Quelldatei, wobei Objective-C eine strenge C-Obermenge ist, können Sie mischen Ziel c und C

    – Vinzzz

    16. September 2015 um 12:40 Uhr


  • Kein Problem, die Gutschrift ist mir egal, solange die Antwort richtig ist 😉 Übrigens, .mm ist zum Mischen von Objective-C und C++ (C und C++ sind trotz des Namens zwei verschiedene Dinge)

    – Vinzzz

    17. September 2015 um 9:19 Uhr


  • Ich möchte erwähnen, dass C++ im Gegensatz zum objektiven C keine C-Obermenge ist, sodass Sie C und C++ nicht in einer .cpp-Datei mischen können. Nur C++ und Assembler.

    – Wertigkeit

    14. Oktober 2015 um 10:10 Uhr

  • Falls jemand feststellt, dass diese gut detaillierte Antwort beim Versuch, Swift-Dateien in ihrer Objective-C/C++-Datei verfügbar zu machen, nicht ganz hilft (Xcode beschwert sich, dass die Swift-Header-Datei nicht gefunden wird). Ich fand, dass ich musste import “ProductName/ProductModuleName-Swift.h” in meiner Objective-C/C++-Quelldatei. Ich fand das etwas vergraben bei: developer.apple.com/library/ios/documentation/Swift/Conceptual/…

    – AeroBuffalo

    1. April 2016 um 16:04 Uhr


  • Guter Punkt. Für ein funktionierendes Projekt, das diese Sprachen mischt, werfen Sie einen Blick auf stackoverflow.com/a/32546879/218152.

    – SwiftArchitect

    1. April 2016 um 18:28 Uhr

1646974822 698 Kann ich Swift mit C mischen Wie die Objective C mm Dateien
Rob Napier

Nein. Wenn Sie von .m zu .mm wechseln, wechseln Sie tatsächlich von Objective-C zu einer anderen Sprache (die viele subtile Unterschiede aufweist) namens Objective-C++. Sie verwenden also nicht wirklich C++; Sie verwenden Objective-C++, das die meisten C++ als Eingabe akzeptiert (genauso wie C++ die meisten, aber nicht alle C als Eingabe akzeptiert). Wenn ich sage, dass es nicht ganz C++ ist, stellen Sie sich eine C++-Datei vor, die eine Variable namens enthält nil (das legales C++ ist) und dann versuchen, das als Objective-C++ zu kompilieren.

Swift hat nicht die gleiche Beziehung. Es ist keine Obermenge von C oder C++, und Sie können keines von beiden direkt in einem verwenden .swift Datei.

“Swift mit Cocoa und Objective-C verwenden” sagt uns auch:

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

  • Eigentlich ziemlich nervig – wir alle mit Cocoa-Apps, die C/C++-Codebasen enthalten, müssen jetzt geschriebene Projekte pflegen 3 Sprachen….

    – Jay

    24. Juli 2014 um 17:34 Uhr


  • Ich schlage vor, dass Objective-c++ keine andere Sprache ist, aber eine Mischung aus c++ und Objective-c unterscheidet sich subtil, aber es ist immer noch da

    – amar

    14. November 2014 um 13:54 Uhr

  • Wie ist “null” legales C++? So etwas gibt es nicht (zumindest in Standard-C++) Bitte geben Sie ein weiteres Beispiel

    – nachwühlen

    26. November 2014 um 23:56 Uhr

  • Aber mit ObjC können Sie einfach gehen .mm Ihre Dateien und Sie sind (fast) fertig. Nicht so bei Swift.

    – chakrit

    8. Dezember 2014 um 3:23 Uhr

  • @rewolf, ich glaube, er meint eine Variable mit dem Namen nilwie int nil

    – Lukas

    12. Dezember 2014 um 15:05 Uhr

Ich habe ein einfaches Xcode 6-Projekt geschrieben, das zeigt, wie man C++, Objective C und Swift-Code mischt:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

Insbesondere das Beispiel ruft eine Objective C- und eine C++-Funktion von Swift auf.

Der Schlüssel besteht darin, einen gemeinsam genutzten Header Project-Bridging-Header.h zu erstellen und die Objective C-Header dort abzulegen.

Bitte laden Sie das Projekt als vollständiges Beispiel herunter.

  • Danke für diesen Gian!

    – Jason Elwood

    5. September 2014 um 22:13 Uhr

  • Vielen Dank für dieses Beispiel, aber wenn ich #import „CPlusPlus.h“ von ObjCtoCPlusPlus.mm in die Datei ObjCtoCPlusPlus.h verschieben möchte, gibt der Compiler diesen Fehler zurück: :0: error: failed to import bridging header ‘ /Users/Ale/Downloads/shared-master/C-ObjC-Swift/Performance_Console/Performance_Console/Performance_Console-Bridging-Header.h’ ist es möglich, diesen Import in die Header-Datei zu verschieben?

    – Alessandro Pirovano

    9. Dezember 2014 um 8:07 Uhr

  • @API: Nein, du verfehlst den Punkt. ObjCtoCPlusPlus.h/“.mm` existiert nur für den Zweck, eine Ob-C-Schnittstelle zu C++-Code bereitzustellen – es ist die Brücke, die hier eine notwendige Komponente ist. Lassen Sie die Includes dort, wo sie sind, und fügen Sie eine Methode in der hinzu ObjCtoCPlusPlus.… Dateien für jede C++-Methode, auf die Sie Zugriff benötigen. Du tust gut daran, noch einmal zu lesen sourcemaking.com/design_patterns/adapter

    – Slipp D. Thompson

    22. Oktober 2015 um 18:46 Uhr

  • Ich habe Ihr Beispiel heruntergeladen und es ist fantastisch für die STATIC-Funktion, die die Klasse als Beispiel anbietet, aber ich schaffe es nicht, das Beispiel für eine zusätzliche nicht statische Funktion anzupassen, die von außen verwendet werden soll … Ist es auch möglich? (Ich habe meine C++-Hausaufgaben vor Jahrzehnten gemacht … Ich bin im Moment nicht der schärfste Bleistift der Box)

    – Isaak

    26. Mai 2019 um 19:35 Uhr


Du kannst auch Überspringen Sie das Ziel-C Datei dazwischen. Fügen Sie einfach eine C-Header-Datei mit einer .cpp-Quelldatei hinzu. Verwenden Sie nur C-Deklarationen in der Headerdatei und fügen Sie beliebigen C++-Code in die Quelldatei ein. Fügen Sie dann die C-Header-Datei in die **-Bridging-Header.h ein.

Das folgende Beispiel gibt einen Zeiger auf ein C++-Objekt (struct Foo) zurück, sodass Swift in einem COpaquePointer speichern kann, anstatt dass struct Foo im globalen Bereich definiert ist.

Foo.h-Datei (von Swift gesehen – in der Bridging-Datei enthalten)

#ifndef FOO_H
#define FOO_H

// Strictly C code here.
// 'struct Foo' is opaque (the compiler has no info about it except that 
// it's a struct we store addresses (pointers) to it.
struct Foo* foo_create();
void foo_destroy(struct Foo* foo);

#endif

Innerhalb der Quelldatei Foo.cpp (nicht von Swift gesehen):

extern "C"
{
#include "Foo.h"
}
#include <vector>

using namespace std;

// C++ code is fine here. Can add methods, constructors, destructors, C++ data members, etc.
struct Foo
{
   vector<int> data;
};

struct Foo* foo_create()
{
   return new Foo;
}

void foo_destroy(struct Foo* foo)
{
    delete foo;
}

Ich habe gerade ein kleines Beispielprojekt mit Swift, Objective-C und C++ erstellt. Es ist eine Demo zur Verwendung von OpenCV-Stitching in iOS. Die OpenCV-API ist C++, daher können wir nicht direkt von Swift aus damit sprechen. Ich verwende eine kleine Wrapper-Klasse, deren Implementierungsdatei Objective-C++ ist. Die Header Datei ist sauberes Objective-C, sodass Swift direkt damit kommunizieren kann. Sie müssen darauf achten, keine C++-ähnlichen Dateien indirekt in die Header zu importieren, mit denen Swift interagiert.

Das Projekt ist hier: https://github.com/foundry/OpenCVSwiftStitch

  • Ich denke, dies beantwortet ein Problem, auf das ich heute gestoßen bin, als ich versuchte, eine KudanCV-Bibliothek eines Drittanbieters mit Swift zu verwenden. Mein Bridging-Header importiert seine .h-Datei, die Importe in und enthält, die meiner Meinung nach aus C++-Bibliotheken oder -Dateien stammen, daher wird mein Swift-Code nicht kompiliert. Ich wäre dankbar, wenn mir jemand sagen könnte, ob es einen Weg gibt, dies zu umgehen … oder ob ich meinen gesamten Code in Objective-C neu schreiben muss

    – Raketengarten

    26. April 2017 um 16:51 Uhr

  • @RocketGarden – KudanCV-Header-Datei ist C++. Sie könnten einen Wrapper schreiben, der genauso funktioniert wie meine Wrapper-Beispielklasse. ODER Sie schreiben die Teile Ihrer App neu, die mit KudanCV in Objective-C++ (mit Objective-C-Headern) kommunizieren müssen. Sie müssten die Teile Ihres Projekts, die sich nicht mit KudanCV befassen, nicht neu schreiben.

    – Gießerei

    27. April 2017 um 0:36 Uhr

  • Danke dafür, ich habe es ungefähr 5 Minuten später gemerkt, aber es ist nützlich, es für andere aufzunehmen.

    – Raketengarten

    27. April 2017 um 5:43 Uhr

1646974823 478 Kann ich Swift mit C mischen Wie die Objective C mm Dateien
Sandig

Hier ist mein Versuch eines Clang-Tools zur Automatisierung der C++/Swift-Kommunikation. Sie können C++-Klassen von Swift instanziieren, von C++-Klassen erben und sogar virtuelle Methoden in Swift überschreiben.
Es analysiert die C++-Klasse, die Sie in Swift exportieren möchten, und generiert automatisch die Objective-C/Objective-C++-Bridge.

https://github.com/sandym/swiftpp

  • Ich denke, dies beantwortet ein Problem, auf das ich heute gestoßen bin, als ich versuchte, eine KudanCV-Bibliothek eines Drittanbieters mit Swift zu verwenden. Mein Bridging-Header importiert seine .h-Datei, die Importe in und enthält, die meiner Meinung nach aus C++-Bibliotheken oder -Dateien stammen, daher wird mein Swift-Code nicht kompiliert. Ich wäre dankbar, wenn mir jemand sagen könnte, ob es einen Weg gibt, dies zu umgehen … oder ob ich meinen gesamten Code in Objective-C neu schreiben muss

    – Raketengarten

    26. April 2017 um 16:51 Uhr

  • @RocketGarden – KudanCV-Header-Datei ist C++. Sie könnten einen Wrapper schreiben, der genauso funktioniert wie meine Wrapper-Beispielklasse. ODER Sie schreiben die Teile Ihrer App neu, die mit KudanCV in Objective-C++ (mit Objective-C-Headern) kommunizieren müssen. Sie müssten die Teile Ihres Projekts, die sich nicht mit KudanCV befassen, nicht neu schreiben.

    – Gießerei

    27. April 2017 um 0:36 Uhr

  • Danke dafür, ich habe es ungefähr 5 Minuten später gemerkt, aber es ist nützlich, es für andere aufzunehmen.

    – Raketengarten

    27. April 2017 um 5:43 Uhr

1646974824 596 Kann ich Swift mit C mischen Wie die Objective C mm Dateien
Austin

Swift ist nicht direkt mit C++ kompatibel. Sie können das Problem umgehen, indem Sie Ihren C++-Code mit Objective-C umschließen und den Objective-C-Wrapper in Swift verwenden.

989920cookie-checkKann ich Swift mit C++ mischen? Wie die Objective-C .mm-Dateien

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy