【发布时间】:2018-08-09 19:36:16
【问题描述】:
我正在尝试与 Swift 的 C API 进行交互,并且能够成功地将 unsigned char* 转换为 String,但无法将 String 转换回 unsigned char *
这是我的 C 函数,它返回传递的字符串:
unsigned char* test(unsigned char* hello) {
return hello;
}
这是我调用不起作用的 c 函数的快速代码:
让 str = "你好,世界!"
打印(字符串(cString:test(str)))
它的目标是把“hello, world”传给c,然后让c传回“hello, world”然后打印出来。
我已经尝试过这里的解决方案,但它们对于 Swift 4 来说似乎都已经过时了
缓冲尝试:
让缓冲区 = UnsafeMutableBufferPointer.allocate(容量: 4)
_ = buffer.initialize(来自:1...4)
打印(字符串(cString:测试(缓冲区)))
错误:
无法将“UnsafeMutableBufferPointer”类型的值转换为预期的参数类型“UnsafeMutablePointer!”
【问题讨论】:
-
“我已经尝试过这里的解决方案”之类的?
-
返回从自动
String到指针转换中获得的指针是不安全的,因为它的存储只保证在调用期间有效。如果您的 C API 确实做了类似的事情,您将无法使用自动转换。 -
什么是
String? -
@WeatherVane,它是 Swift 中的标准字符串类型。
-
您需要使用UnsafeMutableBufferPointer.allocate,将您的字符串复制到那里,做您需要做的任何事情,然后释放缓冲区指针。