在 Swift 中创建一个字符串缓冲区供 C 使用并稍后释放

Create a String buffer in Swift for C to consume and free later

对于那些了解 Rust 的人的问题的快速形式: 是否有 Swift 5 等价于 std::ffi::CString 可以拥有一个 String 并将其转换变成 char* 比如 into_raw and later free/drop it using something like from_raw?

更长的版本:

我有一个 C API,我正在 Swift 消费。我必须提供一个回调函数,我将其作为闭包参数提供,并且该闭包必须 return 一个空终止字符串作为 const char *——在 Swift 中,它被键入为 UnsafePointer<Int8>?.

显然必须有人负责该内存以及何时释放它。在这种情况下,我想说它是堆分配的,并且 Swift 负责它并且它将保持 const char * 活动直到 C 接口完成它并调用某种 free()函数。

在使用 UTF-8 字符串初始化的 Swift 中分配一些内存,向 C 提供 const char *,然后在收到指令后释放它的最简单的方法是什么?

两个可能的选择:

let swiftString = "Hello world"
swiftString.withCString { cStringPtr in
    // use `cStringPtr` ...

}

调用带有指针的闭包 Swift 字符串(UTF-8 编码)的 C 字符串表示。该指针仅在闭包执行期间有效。

为了更长的寿命,你可以这样做

let swiftString = "Hello world"
let cStringPtr = strdup(swiftString)
// use `cStringPtr` ...

它从给定的 Swift 字符串分配一个新的 C 字符串,并稍后使用

释放该内存
free(cStringPtr)