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)
尝试与 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)