尝试与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是否应该通过其自动桥接来处理这些问题?
答案 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)