使用Swift引用使用指针

时间:2015-05-04 20:45:07

标签: swift pointers

作为Xcode的新手,我正在尝试使用使用指针的外部C调用,而我很难找到在Swift中引用它们的方法。 C中的原始调用定义为:

int32 FAR PASCAL swe_calc(double tjd, int ipl, int32 iflag, double *xx, char *serr)

其中xx是指向6个双打数组的指针,serr是指向任何错误消息的指针

斯威夫特将其视为:

int32 swe_calc(tjd: Double, ipl: Int32, iflag: int32, xx: UnsafeMutablePointer<Double>, serr: UnsafeMutablePointer<Int8>)

(来自:https://github.com/dwlnetnl/SwissEphemeris/tree/master/SwissEphemeris

我试过的最接近的事情就是:

var serr : UnsafeMutablePointer<Int8> = nil; // returns any error messages from the call
var x  = [Double](count: 6, repeatedValue: 0); // array of 6 doubles returned from the call
var xx : UnsafeMutablePointer<Double> ;

xx = &x
swe_calc(2436647.0003794227, 4, 258, xx, serr)
println("xx = \(x[0]), \(x[1]), \(x[2]), \(x[3]), \(x[4]), \(x[5]), errors (if any)=\(serr)")

xx=&x行给出错误

  

无法将输入类型[(Double)]的值分配给'UnsafeMutablePointer'类型的值

我需要一种方法来获取/引用/使用从xx返回的值到6个双精度数组中,serr绝对不应该是Int8,而是字符串代替。 (我可以让其他Java和C#版本工作,但是Swift让我感到难过。)

如何进行swe_calc调用以满足其需要,并获得我需要的内容?

1 个答案:

答案 0 :(得分:2)

你很亲密。两个UnsafeMutablePointer参数都需要 使用&作为“inout参数”传递的相应类型的数组:

var x  = [Double](count: 6, repeatedValue: 0);
var serr = [Int8](count: 1024, repeatedValue: 0)
let result = swe_calc(2436647.0003794227, 4, 258, &x, &serr)

当然,数组必须按预期分配足够大 C函数。

如果该函数将NUL终止的错误字符串放入缓冲区 由serr指向,然后您可以将其转换为Swift字符串:

let errorString = String.fromCString(&serr)