PLplotの最初のをSwiftに移植してみた。

simple

プリプロセッサでの#defineは,定数には対応しているが別名には対応していないようで,pl()ではなくc_pl()を直接書く必要がある。PLINTはInt32なので,配列の要素数はInt()で型変換する必要がある。コマンドライン引数argc, argvは,SwiftではC_ARGC,C_ARGVかProcess.argumentsで参照できる。Process.argumentsは[String]を,C_ARGVはUnsafePointer<Int8>を返すので,どちらかをUnsafeMutablePointer()でキャストして渡す。

main.swift

let n: PLINT = 101
let xmin: PLFLT = 0.0; let xmax: PLFLT = 1.0
let ymin: PLFLT = 0.0; let ymax: PLFLT = 100.0
var x = [PLFLT](count: Int(n), repeatedValue: 0.0)
var y = [PLFLT](count: Int(n), repeatedValue: 0.0)
for (index, value) in enumerate(x) {
 x[index] = PLFLT(index) / (PLFLT(n) - 1)
 y[index] = ymax * x[index] * x[index]
}
var argc: Int32 = Int32(C_ARGC)
c_plparseopts(&argc, UnsafeMutablePointer(C_ARGV), PL_PARSE_FULL)
c_plinit()
c_plenv(xmin, xmax, ymin, ymax, 0, 0)
c_pllab("x", "y=100 x#u2#d", "Simple PLplot demo of a 2D line plot")
c_plline(n, x, y)
c_plend()

Makefile

SWIFT = /usr/bin/xcrun swiftc
CPPFLAGS = -I/usr/include -I/opt/local/include/plplot
LDFLAGS = -L/opt/local/lib -lplplotd
TARGET = simple
OBJS = main.o
HDRS = $(TARGET).h

$(TARGET) : $(OBJS)
	$(SWIFT) $(LDFLAGS) $^ -o $@

%.o : %.swift
	$(SWIFT) $(CPPFLAGS) -c $< -import-objc-header $(HDRS)

clean :
	rm $(TARGET) $(OBJS)