Swift 到 C 的桥接:字符串到 UnsafePointer<Int8>?是否自动桥接?
Posted
技术标签:
【中文标题】Swift 到 C 的桥接:字符串到 UnsafePointer<Int8>?是否自动桥接?【英文标题】:Swift to C bridging: String to UnsafePointer<Int8>? is not automatically bridged?Swift 到 C 的桥接:字符串到 UnsafePointer<Int8>?是不是自动桥接? 【发布时间】:2019-02-09 19:39:43 【问题描述】:在尝试与 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 字符串传递给不符合 Swift ARC 规则的 C 代码。我认为在这种情况下您需要使用 UnmanagedUnmanaged<T>
在这里无济于事,它只用于 classes T
。
【参考方案1】:
从 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)
【讨论】:
以上是关于Swift 到 C 的桥接:字符串到 UnsafePointer<Int8>?是否自动桥接?的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 Swift 项目中使用 Objective C 可可豆荚,桥接文件编译为 Swift 代码
将 Objective C 框架导入我的 Swift 项目后,我的项目无法识别桥接文件中的头文件