我正在使用
Swift的C API,并且我需要调用一个方法,我需要给出一个
UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>
更多信息:
Swift接口:
public func presage_predict(prsg: presage_t,_ result: UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>) -> presage_error_code_t
原C:
presage_error_code_t presage_predict(presage_t prsg,char*** result);
通常,如果函数采用UnsafePointer< T>参数
那么你可以传递一个类型为T的变量,如“inout”参数和& ;.在你的情况下,T是
那么你可以传递一个类型为T的变量,如“inout”参数和& ;.在你的情况下,T是
UnsafeMutablePointer<UnsafeMutablePointer<Int8>>
var prediction : UnsafeMutablePointer<UnsafeMutablePointer<Int8>> = nil if presage_predict(prsg,&prediction) == PRESAGE_OK { ... }
从Presage库的文档和示例代码我
明白这会分配一个字符串数组并分配
此数组的地址为预测指向的变量.
为了避免内存泄漏,最终必须释放这些字符串
同
presage_free_string_array(prediction)
为了证明这确实有效,我采取了第一个
部分演示代码在presage_c_demo.c并翻译过来
到斯威夫特:
// 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,&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)
这实际上起作用并产生了输出
prediction[0]: say prediction[1]: said prediction[2]: savages prediction[3]: saw prediction[4]: sat prediction[5]: same
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。