通常,如果一个函数接受 UnsafePointer<T>
参数,那么你可以使用 &
将类型为 T
的变量作为 "inout" 参数传递。在你的情况下,T
是
UnsafeMutablePointer<UnsafeMutablePointer<Int8>>
这是
char **
的Swift映射。因此,您可以按照以下方式调用C函数:
var prediction : UnsafeMutablePointer<UnsafeMutablePointer<Int8>> = nil
if presage_predict(prsg, &prediction) == PRESAGE_OK { ... }
根据Presage库的文档和示例代码,我理解这将分配一个字符串数组并将该数组的地址分配给指向prediction
变量的指针。为避免内存泄漏,这些字符串最终必须被释放。
presage_free_string_array(prediction)
为了证明这确实有效,我已经将
presage_c_demo.c的演示代码的第一部分翻译成了Swift:
// Duplicate the C strings to avoid premature deallocation:
let past = strdup("did you not sa")
let future = strdup("")
func get_past_stream(arg: UnsafeMutablePointer<Void>) -> UnsafePointer<Int8> {
return UnsafePointer(past)
}
func get_future_stream(arg: UnsafeMutablePointer<Void>) -> UnsafePointer<Int8> {
return UnsafePointer(future)
}
var prsg = presage_t()
presage_new(get_past_stream, nil, get_future_stream, nil, &prsg)
var prediction : UnsafeMutablePointer<UnsafeMutablePointer<Int8>> = nil
if presage_predict(prsg, &prediction) == PRESAGE_OK {
for var i = 0; prediction[i] != nil; i++ {
// Convert C string to Swift `String`:
let pred = String.fromCString(prediction[i])!
print ("prediction[\(i)]: \(pred)")
}
presage_free_string_array(prediction)
}
free(past)
free(future)
这实际上是有效的并产生了输出
预测[0]: 说
预测[1]: 说过
预测[2]: 野蛮人
预测[3]: 看到
预测[4]: 坐着
预测[5]: 相同的