Cの函数は,Swiftから直接呼び出せる。
オプション-import-objc-headerを使って名前を解決し,Swiftのソースをコンパイルする。推奨しないと断って,stackoverflowの質疑に書いてある。Xcode 6-Beta5からはSwiftコンパイラの名前がswiftcとなった。
$ xcrun swiftc -c main.swift -import-objc-header addtwo.h $ clang -O2 -c addtwo.c $ xcrun swift main.o addtwo.o -o addtwo
CC = /usr/bin/clang CFLAGS = -O3 SWIFT = /usr/bin/xcrun swiftc TARGET = addtwo OBJS = $(TARGET).o main.o HDRS = $(TARGET).h all : $(TARGET) $(TARGET) : $(OBJS) $(SWIFT) $^ -o $@ %.o : %.swift $(SWIFT) -c $< -import-objc-header $(HDRS) clean : rm $(TARGET) *.o
#include "addtwo.h" double addtwo(double x, double y) { return x + y; }
var x = 1.0 var y: Double = 2.0 println(addtwo(x, y))
CのdoubleはSwiftのCDoubleに対応するが,型推論を使っても,Doubleでも正しく動作する。変数は値渡し。
double *はUnSafePointer<Double>だが,Swift blogにある通りSwiftのarrayのアドレスを直接渡せる。
#include "csum.h" double csum(const double * x, long n) { double y = 0; for (int i = 0; i < n; i++) { y += x[i]; } return y; }
let v = [1.0, 2.0, 3.0] println(csum(v, v.count)) var w = [4.0, 5.0, 6.0] println(csum(&w, w.count))
const double*にはletで定義した書き換え不可の配列やvarで定義した配列のアドレスが渡せる。
外部のライブラリは,ライブラリとヘッダをプロジェクトに追加する。ちなみに共有ライブラリは次のように作る。
$ clang -dynamiclib -Wl,-install_name パス オブジェクトファイル -o ライブラリ名.dylib
Accelerate.frameworkを使う。
import Accelerate let s1 = [1.0, 1.0, 2.0] let s2 = [1.0, 1.0, 0.5] println(cblas_ddot(CInt(s1.count), s1, 1, s2, 1))
Accelerateは,XcodeプロジェクトだけでなくREPLでも同様にimportして使える。