Použití funkcí C ve swift vyžaduje překlenovací záhlaví, které obsahuje všechny funkce C, které potřebujete. Například myBridgingHeader.h, který obsahuje #include "Car.h" a cokoli jiného C, co chcete. Domnívám se, že C++ není v současné době podporován.
Jakmile budete mít překlenovací záhlaví, musíte na to rychle upozornit. Uživatelé Xcode to získají zdarma, když to přidají do projektu. V Linuxu použijte při kompilaci příznak '-import-objc-header /path/to/header'.
Edit:Níže jsem přidal kompletní příklad sestávající ze 6 souborů pro všechny ostatní, kteří mohou mít tuto otázku. Je to v podstatě stejné jako to výše, ale neviděl jsem to, dokud jsem to nedal dohromady haha. Také to může být užitečné pro někoho, kdo potřebuje propojit statické knihovny.
Zkopírujte obsah souboru níže do vhodně pojmenovaných souborů make
a poté ./hello
a to by mělo fungovat. Pro pořádek, spustil jsem to pouze na swift verzi 2.2-dev (použijte swift --version
zkontrolovat ten váš)
-
hello.swift:
let n: Int32 = 5 print("Hello, Swift World!") print("mult2(\(n,N)) = \(mult2(n,N))") print("CONST1=\(CONST1), CONST2=\(CONST2), CONST3=\(CONST3)")
-
bridge.h:
#include "defs.h" #include "mult.h"
-
defs.h:
#define CONST1 1 #define CONST2 2 #define CONST3 3
-
mult.h:
#define N 7 int mult2(int,int);
-
mult.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
Pokud z kódu C vytvoříte knihovnu, můžete vytvořit systémový modul pro to, které lze poté importovat do Swiftu, viz tato odpověď:Použijte knihovnu C ve Swiftu na Linuxu.
Dalším způsobem, jak k tomuto úkolu přistoupit, je vytvořit překlenovací hlavičku, jak navrhuje @Philip. Zde je příliš zjednodušený příklad. Podívejme se na následující kód C:
/* In car.h */
int getInt();
/* In car.c */
int getInt() { return 123; }
Jako přemosťovací hlavičku použijeme car.h. Swift zdroj je (v souboru junk.swift
):
print("Hi from swift!")
var i = getInt()
print("And here is an int from C: \(i)!")
Nejprve vytvořte objektový soubor car.o
, z car.c
:
gcc -c car.c
Nyní vytvořte spustitelný soubor junk
, takto:
swiftc -import-objc-header car.h junk.swift car.o -o junk
Spuštění spustitelného souboru dává:
$ ./junk
Hi from swift!
And here is an int from C: 123!
-import-objc-header
možnost je skrytá. Chcete-li jej zobrazit a spoustu dalších skrytých možností, spusťte:
swiftc -help-hidden
Udělal jsem to pomocí snímku vývoje Swift 3.0 pro Ubuntu 14.04 z 12. dubna, který je k dispozici zde:https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- SNAPSHOT-2016-04-12-a-ubuntu14.04.tar.gz
Nyní, pokud chcete používat C++, budete muset vytvořit obal, napsaný ve zdrojovém souboru C++ a zkompilovaný pomocí kompilátoru C++, ale s funkcemi volatelnými z C pomocí extern "C"
. Tyto funkce lze poté volat ze Swift jako jakoukoli funkci C. Viz například tato odpověď:Mohu smíchat Swift s C++? Stejně jako Objective - C .mm soubory