Переход с 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 действительна только на время вызова функции.

Если строка 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)
Другие вопросы по тегам