Переход с C на мост: строка в UnsafePointer<Int8>? не соединен автоматически?
При попытке взаимодействия с библиотекой 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 не должен был справиться с этим через автоматическое соединение?
1 ответ
Решение
Автоматическое создание строкового представления C из Swift String
выполняется только при вызове функции, принимающей UnsafePointer<Int8>
аргумент (сравните строковое значение с поведением параметра функции UnsafePointer
Если строка 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)