微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 如何创建UnsafeMutablePointer >>

我正在使用 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”参数和&amp ;.在你的情况下,T是
UnsafeMutablePointer<UnsafeMutablePointer<Int8>>

这是char **的Swift映射.所以你可以调用C函数

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] 举报,一经查实,本站将立刻删除。

相关推荐