L'utilisation des fonctions C dans Swift nécessite un en-tête de pontage qui inclut toutes les fonctionnalités C dont vous avez besoin. Par exemple, myBridgingHeader.h qui contient #include "Car.h" et tout autre élément C que vous voulez. Je crois que C++ n'est actuellement pas pris en charge.
Une fois que vous avez l'en-tête de pontage, vous devez en informer Swift. Les utilisateurs de Xcode l'obtiennent gratuitement lorsqu'ils l'ajoutent au projet. Sous Linux, utilisez l'indicateur '-import-objc-header /path/to/header' lors de la compilation.
Edit :J'ai ajouté un exemple complet ci-dessous composé de 6 fichiers pour tous ceux qui pourraient avoir cette question. C'est fondamentalement le même que celui ci-dessus mais je ne l'ai pas vu jusqu'à ce que je l'aie déjà assemblé haha. En outre, cela peut être utile pour quelqu'un qui a besoin d'établir un lien avec des bibliothèques statiques.
Copiez le contenu du fichier ci-dessous dans des fichiers nommés de manière appropriée, make
, puis ./hello
et ça devrait marcher. Pour mémoire, je n'ai exécuté ceci que sur la version 2.2-dev de Swift (utilisez swift --version
pour vérifier le vôtre)
-
bonjour.swift :
let n: Int32 = 5 print("Hello, Swift World!") print("mult2(\(n,N)) = \(mult2(n,N))") print("CONST1=\(CONST1), CONST2=\(CONST2), CONST3=\(CONST3)")
-
pont.h :
#include "defs.h" #include "mult.h"
-
defs.h :
#define CONST1 1 #define CONST2 2 #define CONST3 3
-
multi.h :
#define N 7 int mult2(int,int);
-
multi.c :
#include "defs.h" #include "mult.h" int mult2(int a, int b) { return a*b; }
-
Makefile :
all: hello hello: libmult.a swiftc hello.swift -import-objc-header ./bridge.h -L. -lmult -o hello libmult.a: mult.o ar -rc libmult.a mult.o ranlib libmult.a mult.o: mult.c mult.h defs.h gcc -c mult.c -o mult.o .PHONY: clean clean: rm -f *.o *.a hello
Si vous construisez une bibliothèque à partir de votre code C, vous pouvez créer un module système pour cela, qui peut ensuite être importé dans Swift, consultez cette réponse :Utiliser une bibliothèque C dans Swift sous Linux.
Une autre façon d'aborder cette tâche consiste à créer un en-tête de pontage, comme suggéré par @Philip. Voici un exemple trop simplifié. Considérons le code C suivant :
/* In car.h */
int getInt();
/* In car.c */
int getInt() { return 123; }
Nous utiliserons car.h comme en-tête de pontage. La source rapide est (dans le fichier junk.swift
):
print("Hi from swift!")
var i = getInt()
print("And here is an int from C: \(i)!")
Tout d'abord, créez un fichier objet, car.o
, à partir de car.c
:
gcc -c car.c
Construisez maintenant un exécutable, junk
, comme suit :
swiftc -import-objc-header car.h junk.swift car.o -o junk
L'exécution de l'exécutable donne :
$ ./junk
Hi from swift!
And here is an int from C: 123!
Le -import-objc-header
option est masquée. Pour le voir et un tas d'autres options cachées, exécutez :
swiftc -help-hidden
Je l'ai fait en utilisant l'instantané de développement Swift 3.0 pour Ubuntu 14.04 du 12 avril, disponible ici :https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- INSTANTANÉ-2016-04-12-a-ubuntu14.04.tar.gz
Maintenant, si vous voulez utiliser C++, vous devrez créer un wrapper, écrit dans un fichier source C++ et compilé avec un compilateur C++, mais avec des fonctions appelables depuis C en utilisant extern "C"
. Ces fonctions peuvent ensuite être appelées depuis Swift comme n'importe quelle fonction C. Voir, par exemple, cette réponse :Puis-je mélanger Swift avec C++ ? Comme les fichiers Objective - C .mm