Puis-je mélanger Swift avec C ++? Comme les fichiers Objective – C .mm

Je viens de changer mes fichiers .m en .mm et d’utiliser C ++. Y a-t-il un moyen de faire la même chose avec Swift?

Non. Lorsque vous passez de .m à .mm, vous passez de Objective-C à un autre langage (qui présente de nombreuses différences subtiles) appelé Objective-C ++. Donc, vous n’utilisez pas vraiment C ++; vous utilisez Objective-C ++ qui accepte la plupart des entrées en C ++ (de la même manière que C ++ accepte la plupart des entrées, mais pas toutes). Quand je dis que ce n’est pas tout à fait C ++, considérez un fichier C ++ qui inclut une variable nommée nil (ce qui est légal C ++), puis essayez de comstackr cela en tant qu’Objective-C ++.

Swift n’a pas la même relation. Ce n’est pas un sur-ensemble de C ou C ++, et vous ne pouvez pas utiliser directement l’un ou l’autre dans un fichier .swift .

“Utiliser Swift avec Cocoa et Objective-C” nous dit aussi:

Vous ne pouvez pas importer de code C ++ directement dans Swift. Au lieu de cela, créez un wrapper Objective-C ou C pour le code C ++.

La confusion peut venir de l’hypothèse que le simple fait de changer une extension de fichier de .m à .mm est tout ce dont vous avez besoin pour faire le .m les langues, alors qu’en réalité elle ne fait rien de tel. Ce n’est pas le .mm qui provoque la friction avec .cpp , c’est l’en-tête .h qui ne doit pas être un en-tête C++ .


Même projet: Oui.

Dans le même projet, vous pouvez combiner avec bonheur C , C ++ , Objective-C , Objective C ++ , Swift et même Assembly .

  1. ...Bridging-Header.h : vous exposez C , Objective-C et Objective-C ++ à Swift en utilisant ce pont
  2. -Swift.h : expose automatiquement vos classes Swift marquées avec @objc à Objective-C
  3. .h : c’est la partie délicate, car ils sont utilisés de manière ambiguë pour toutes les versions de C , ++ ou non, Objective ou non. Lorsqu’un .h ne contient pas un seul mot-clé C ++ , comme la class , il peut être ajouté à ...Bridging-Header.h , et exposera toutes les fonctions qu’il déclare aux fonctionnalités .cpp ou .cpp correspondantes. Sinon, cet en-tête doit être encapsulé dans une API C ou Objective-C pure.

Même fichier: non

Dans le même fichier, vous ne pouvez pas mélanger tous les 5. Dans le même fichier source :

  1. .swift : vous ne pouvez pas mélanger Swift avec quelque chose
  2. .m : vous pouvez mélanger Objective-C avec C. ( @Vinzzz )
  3. .mm : vous pouvez mélanger Objective-C avec C ++ . Ce pont est Objective-C ++ . ( @Vinzzz ).
  4. .c : pur C
  5. .cpp : vous pouvez mélanger C ++ & Assembly ( @Vality )
  6. .h : omniprésent et ambigu C , C ++ , Objective-C ou Objective-C ++ , la réponse est que cela dépend.

Les références

  • Invoquer l’assemblage de C ++ ( Brett Hale )
  • Invoquer Swift d’Objective-C ( Svitlana )
  • Invoquer C, C ++, Obj-C, Obj-C ++ depuis Swift ( SwiftArchitect , self)
  • Pour télécharger un projet complet iOS 9, Xcode 7, recherchez SO-32541268 dans les recettes Swift.

J’ai écrit un simple projet Xcode 6 qui montre comment mélanger le code C ++, Objective C et Swift:

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

En particulier, l’exemple appelle une fonction Objective C et une fonction C ++ du Swift.

La clé est de créer un en-tête partagé Project-Bridging-Header.h et d’y placer les en-têtes Objective C.

Veuillez télécharger le projet comme exemple complet.

Je viens de faire un petit exemple de projet utilisant Swift, Objective-C et C ++. C’est une démonstration de l’utilisation de l’assemblage OpenCV dans iOS. L’API OpenCV est C ++, nous ne pouvons donc pas lui parler directement depuis Swift. J’utilise une petite classe wrapper dont le fichier d’implémentation est Objective-C ++. Le fichier d’en- tête est propre à Objective-C, donc Swift peut communiquer directement avec lui. Vous devez veiller à ne pas importer indirectement de fichiers C ++-ish dans les en-têtes avec lesquels Swift interagit.

Le projet est ici: https://github.com/foundry/OpenCVSwiftStitch

Vous pouvez également ignorer le fichier Objective-C entre les deux. Ajoutez simplement un fichier d’en-tête C avec un fichier source .cpp. N’avoir que des déclarations C dans le fichier d’en-tête et inclure tout code C ++ dans le fichier source. Puis inclure le fichier d’en-tête C dans le ** – Bridging-Header.h.

L’exemple suivant retourne un pointeur sur un object C ++ (struct Foo) afin que Swift puisse stocker dans un COpaquePointer au lieu d’avoir struct Foo défini dans l’espace global.

Fichier Foo.h (vu par Swift – inclus dans le fichier de pontage)

 #ifndef FOO_H #define FOO_H // Ssortingctly C code here. // 'struct Foo' is opaque (the comstackr 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 

Fichier source interne Foo.cpp (non vu par Swift):

 extern "C" { #include "Foo.h" } #include  using namespace std; // C++ code is fine here. Can add methods, constructors, destructors, C++ data members, etc. struct Foo { vector data; }; struct Foo* foo_create() { return new Foo; } void foo_destroy(struct Foo* foo) { delete foo; } 

Voici ma tentative pour un outil clang pour automatiser la communication C ++ / rapide. Vous pouvez instancier les classes C ++ à partir de swift, hériter de la classe C ++ et même remplacer les méthodes virtuelles dans swift.
Il parsingra la classe C ++ que vous souhaitez exporter vers swift et générera automatiquement le pont Objective-C / Objective-C ++.

https://github.com/sandym/swiftpp

Swift n’est pas directement compatible avec C ++. Vous pouvez contourner le problème en encapsulant votre code C ++ avec Objective-C et en utilisant le wrapper Objective C dans Swift.

J’ai aussi un programme de démonstration pour combiner rapidement opencv.

Vous pouvez le télécharger depuis https://github.com/russj/swift_opencv3_demo .

Plus d’informations sur la démo http://flopalm.com/opencv-with-swift/ .

Non, pas dans un seul fichier.

Cependant, vous pouvez utiliser C ++ dans Swift Projects sans avoir besoin d’une bibliothèque ou d’un framework statique. Comme d’autres l’ont dit, l’essentiel est de créer un en-tête de pontage Objective-C qui inclut des en-têtes C ++ compatibles avec le langage C et compatibles avec le truc extern “C” {} .

Tutoriel vidéo: https://www.youtube.com/watch?v=0x6JbiphNS4

Les autres réponses sont légèrement inexactes. Vous pouvez en fait mélanger à la fois Swift et [Objective-] C [++] dans le même fichier, mais pas exactement comme prévu.

Ce fichier (c.swift) se comstack en un exécutable valide avec swiftc c.swift et clang -x objective-c c.swift

 /* /* */ #if 0 // */ import Foundation print("Hello from Swift!") /* /* */ #endif #include  int main() { puts("Hello from C!"); return 0; } // */ 

Au cas où cela serait utile à quiconque, j’ai aussi un bref tutoriel sur l’appel d’une bibliothèque statique simple C ++ à partir d’un utilitaire de ligne de commande Swift sortingvial. Ceci est un morceau de code de preuve de concept vraiment nu.

Aucun Objective-C impliqué, juste Swift et C ++. Le code d’une bibliothèque C ++ est appelé par un wrapper C ++ qui implémente une fonction avec une liaison externe “C”. Cette fonction est ensuite référencée dans l’en-tête de pontage et appelée depuis Swift.

Voir http://www.swiftprogrammer.info/swift_call_cpp.html

Je fournis un lien vers SE-0038 dans la ressource officielle, décrite comme suit: Ce document contient des propositions de modifications et des améliorations visibles par l’utilisateur du langage de programmation Swift.

Le statut actuel est la demande de fonctionnalité qui a été acceptée mais pas encore planifiée.

Ce lien est destiné à orienter quiconque recherche cette fonctionnalité dans la bonne direction