Swift到C的桥接:字符串到UnsafePointer <int8>?不自动桥接?

时间:2019-02-09 19:39:43

标签: c swift vulkan bridging-header

尝试与C库(Vulkan)接口时,在尝试将Swift(4.2)本机字符串分配给C字符串时遇到以下错误

error: cannot assign value of type 'String' to type 'UnsafePointer<Int8>?'

我正在做一个简单的作业

var appInfo = VkApplicationInfo()
appInfo.pApplicationName = "Hello world"

Swift是否应该通过其自动桥接来处理这些问题?

1 个答案:

答案 0 :(得分:2)

只有在调用带有String参数(比较String value to UnsafePointer<UInt8> function parameter behavior)的函数时,才通过Swift UnsafePointer<Int8>自动创建C字符串表示形式,并且C字符串仅有效在函数调用期间。

如果仅在有限的生命期内需要C字符串,那么您可以

let str = "Hello world"
str.withCString { cStringPtr in
    var appInfo = VkApplicationInfo()
    appInfo.pApplicationName = cStringPtr

    // ...
}

要延长使用寿命,您可以复制字符串:

let str = "Hello world"
let cStringPtr = strdup(str)! // Error checking omitted for brevity
var appInfo = VkApplicationInfo()
appInfo.pApplicationName = UnsafePointer(cStringPtr)

并释放不再需要的内存:

free(cStringPtr)