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

如何创建Swift类型UnsafePointer <UnsafePointer <Int8>的实例?传递给C函数

如何解决如何创建Swift类型UnsafePointer <UnsafePointer <Int8>的实例?传递给C函数

我正在尝试从Swift调用C函数

C函数的参数之一定义为类型:

const char * const * i_argv

在Xcode中,自动完成功能将其映射为Swift类型:

_ i_argv: UnsafePointer<UnsafePointer<Int8>?>!

我创建此类实例的所有尝试都失败了

我想传递两个Int8的数组

let args: [Int8] = [ 1,1 ]

如果我直接通过此操作,则会收到错误消息:

cannot convert value of type 'UnsafePointer<Int8>' to expected argument type 'UnsafePointer<UnsafePointer<Int8>?>'

所以我然后尝试将数组包装在外部UnsafePointer中

let argsp: UnsafePointer<Optional<UnsafePointer<Int8>>> = UnsafePointer(args)

但这似乎无法正常工作,并显示错误

cannot assign value of type 'UnsafePointer<Int8>' to type 'UnsafePointer<Optional<UnsafePointer<Int8>>>'

我不知道如何用外部UnsafePointer包装数组的UnsafePointer类型

编辑:

来自C项目的示例:

    #define FIB_ARG_VALUE  "40"
    const char* i_argv[2] = { FIB_ARG_VALUE,NULL };
    result = m3_CallWithArgs (f,1,i_argv);

在您发表评论之后,我设法使用以下参数构造(只是一个编译测试)来编译Swift代码

let argsp: [UnsafePointer<Int8>?] = [ UnsafePointer([1,2,3]),UnsafePointer("40".cString(using: String.Encoding.utf8)) ]

这仍然会发出有关创建悬空指针的警告

解决方法

正如我在评论中写道,

当参数类型为UnsafePointer<UnsafePointer<Int8>?>!时,您需要传递UnsafePointer<Int8>?的数组。

在重新更新的部分中,您了解了部分传递UnsafePointer<Int8>? 数组,但是您未能创建数组的每个元素。

与您的C项目中的示例等效的Swift是:

let FIB_ARG_VALUE = "40"
let result: CInt = FIB_ARG_VALUE.withCString {pointer in
    let i_argv: [UnsafePointer<Int8>?] = [
        pointer,nil
    ]
    return m3_CallWithArgs(f,1,i_argv)
}

编译测试代码的正确方法应如下所示:

let arg1: [Int8] = [1,2,3]
let arg2: String = "40"
_ = arg1.withUnsafeBufferPointer {arg1BufPtr in
    arg2.withCString {arg2Ptr in
        let argsp: [UnsafePointer<Int8>?] = [ arg1BufPtr.baseAddress,arg2Ptr
        ]
        //Use `argsp` inside this block.
        //...
    }
}

在两种情况下,我都假定您的C函数不会保留在i_argv中传递的指针供以后使用,否则您需要进行一些修改才能将内容复制到某个稳定的地址。

或者您可能需要根据实际参数或C函数的功能来修改其他一些部分。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。