【发布时间】:2020-08-26 08:14:18
【问题描述】:
我正在尝试从 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>?的Array。所以,想要传递一个包含两个 Int8 的数组 是没有意义的。你能展示一下 C 中函数的示例用法吗? -
更新原帖
-
感谢更新,能否说明
FIB_ARG_VALUE是如何定义的? -
添加了 FIB_ARG_VALUE 定义和 args 的编译(带有警告)版本。
标签: c swift unsafe-pointers