Menggunakan fungsi C dengan cepat membutuhkan tajuk penghubung yang mencakup semua fungsi C yang Anda butuhkan. Misalnya, myBridgingHeader.h yang berisi #include "Car.h" dan hal-hal C lainnya yang Anda inginkan. Saya yakin C++ saat ini tidak didukung.
Setelah Anda memiliki tajuk penghubung, Anda perlu mengetahuinya dengan cepat. Pengguna Xcode mendapatkan ini secara gratis saat mereka menambahkannya ke proyek. Di Linux, gunakan flag '-import-objc-header /path/to/header' saat kompilasi.
Sunting:Saya telah menambahkan contoh lengkap di bawah ini yang terdiri dari 6 file untuk orang lain yang mungkin memiliki pertanyaan ini. Ini pada dasarnya sama dengan yang di atas tapi saya tidak melihatnya sampai saya menggabungkannya haha. Selain itu, ini mungkin berguna bagi seseorang yang perlu menautkan ke pustaka statis.
Salin isi file di bawah ini ke file dengan nama yang sesuai, make
, lalu ./hello
dan itu seharusnya berhasil. Sebagai catatan, saya hanya menjalankan ini di swift versi 2.2-dev (gunakan swift --version
untuk memeriksa milik Anda)
-
halo.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
Jika Anda membuat pustaka dari kode C, Anda dapat membuat modul sistem untuk itu, yang kemudian dapat diimpor ke Swift, lihat jawaban ini:Gunakan pustaka C di Swift di Linux.
Cara lain untuk melakukan tugas ini adalah dengan membuat tajuk penghubung, seperti yang disarankan oleh @Philip. Berikut adalah contoh yang terlalu disederhanakan. Mari pertimbangkan kode C berikut:
/* In car.h */
int getInt();
/* In car.c */
int getInt() { return 123; }
Kami akan menggunakan car.h sebagai tajuk penghubung. Sumber swift adalah (dalam file junk.swift
):
print("Hi from swift!")
var i = getInt()
print("And here is an int from C: \(i)!")
Pertama, buat file objek, car.o
, dari car.c
:
gcc -c car.c
Sekarang buat sebuah executable, junk
, sebagai berikut:
swiftc -import-objc-header car.h junk.swift car.o -o junk
Menjalankan executable memberi:
$ ./junk
Hi from swift!
And here is an int from C: 123!
-import-objc-header
opsi disembunyikan. Untuk melihatnya dan banyak opsi tersembunyi lainnya, jalankan:
swiftc -help-hidden
Saya melakukan ini menggunakan snapshot pengembangan Swift 3.0 untuk Ubuntu 14.04 mulai 12 April, tersedia di sini:https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-04-12-a/swift-DEVELOPMENT- SNAPSHOT-2016-04-12-a-ubuntu14.04.tar.gz
Sekarang, jika Anda ingin menggunakan C++, Anda perlu membuat pembungkus, ditulis dalam file sumber C++ dan dikompilasi dengan kompiler C++, tetapi dengan fungsi yang dapat dipanggil dari C dengan menggunakan extern "C"
. Fungsi-fungsi itu kemudian dapat dipanggil dari Swift sebagai fungsi C apa pun. Lihat, misalnya, jawaban ini:Bisakah saya mencampur Swift dengan C++? Seperti Objective - file C .mm