Переход к соединению C: строка в UnsafePointer?не соединен автоматически? - PullRequest
0 голосов
/ 09 февраля 2019

При попытке взаимодействия с библиотекой 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 Ответ

0 голосов
/ 09 февраля 2019

Автоматическое создание строкового представления 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...