Swift 到 C 桥接:String 到 UnsafePointer<Int8>?是不是自动桥接了?

Swift to C bridging: String to UnsafePointer<Int8>? is not automatically bridged?

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

从 Swift String 自动创建 C 字符串表示仅在调用带有 UnsafePointer<Int8> 参数的函数时执行(比较 String value to UnsafePointer<UInt8> function parameter behavior),并且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)