El uso de funciones de C en Swift requiere un encabezado puente que incluya toda la funcionalidad de C que necesita. Por ejemplo, myBridgingHeader.h que contiene #include "Car.h" y cualquier otra cosa de C que desee. Creo que C ++ actualmente no es compatible.
Una vez que tenga el encabezado de puente, debe informarlo rápidamente. Los usuarios de Xcode obtienen esto gratis cuando lo agregan al proyecto. En Linux, use el indicador '-import-objc-header /path/to/header' al compilar.
Editar:he agregado un ejemplo completo a continuación que consta de 6 archivos para cualquier otra persona que pueda tener esta pregunta. Es básicamente lo mismo que el de arriba, pero no lo vi hasta que ya lo armé, jaja. Además, puede ser útil para alguien que necesita vincular bibliotecas estáticas.
Copie el contenido del archivo a continuación en archivos con el nombre apropiado, make
, luego ./hello
y eso debería funcionar. Para que conste, solo ejecuté esto en la versión Swift 2.2-dev (use swift --version
para comprobar el tuyo)
-
hola.swift:
let n: Int32 = 5 print("Hello, Swift World!") print("mult2(\(n,N)) = \(mult2(n,N))") print("CONST1=\(CONST1), CONST2=\(CONST2), CONST3=\(CONST3)")
-
puente.h:
#include "defs.h" #include "mult.h"
-
def.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 crea una biblioteca a partir de su código C, puede crear un módulo de sistema para ello, que luego se puede importar a Swift, vea esta respuesta:Use una biblioteca C en Swift en Linux.
Otra forma de abordar esta tarea es crear un encabezado puente, como lo sugiere @Philip. Aquí hay un ejemplo simplificado. Consideremos el siguiente código C:
/* In car.h */
int getInt();
/* In car.c */
int getInt() { return 123; }
Usaremos car.h como encabezado puente. La fuente rápida es (en el archivo junk.swift
):
print("Hi from swift!")
var i = getInt()
print("And here is an int from C: \(i)!")
Primero, cree un archivo de objeto, car.o
, desde car.c
:
gcc -c car.c
Ahora construye un ejecutable, junk
, de la siguiente manera:
swiftc -import-objc-header car.h junk.swift car.o -o junk
Ejecutar el ejecutable da:
$ ./junk
Hi from swift!
And here is an int from C: 123!
El -import-objc-header
la opción está oculta. Para verlo y un montón de otras opciones ocultas, ejecute:
swiftc -help-hidden
Hice esto usando la instantánea de desarrollo de Swift 3.0 para Ubuntu 14.04 del 12 de abril, disponible aquí:https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- INSTANTÁNEA-2016-04-12-a-ubuntu14.04.tar.gz
Ahora, si desea usar C++, deberá crear un contenedor, escrito en un archivo fuente de C++ y compilado con un compilador de C++, pero con funciones que se pueden llamar desde C usando extern "C"
. Esas funciones se pueden llamar desde Swift como cualquier función de C. Vea, por ejemplo, esta respuesta:¿Puedo mezclar Swift con C++? Como los archivos Objective - C .mm