Swift C interop: передача Swift Argv в C argv - PullRequest
1 голос
/ 05 августа 2020

Я работаю над быстрой оболочкой для библиотеки C. Одна такая функция в этой библиотеке ожидает аргументы командной строки в виде char const *const *. Это связано с swift как Optional<UnsafePointer<UnsafePointer<Int8>?>> Из swift я могу получить аргументы командной строки как CommandLine.unsafeArgv типа UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>. Как я могу преобразовать это в ожидаемый неизменяемый тип? Я знаю, что в UnsafePointer есть конструктор, который принимает UnsafeMutablePointer, но я не уверен, как обрабатывать вложенные типы. Предложения как это правильно конвертировать?

1 Ответ

1 голос
/ 05 августа 2020

Попробуйте следующее (проверено с Xcode 12 / swift 5.3)

    let values: UnsafePointer<UnsafePointer<Int8>?> = 
        UnsafeRawPointer(CommandLine.unsafeArgv).bindMemory(
            to: UnsafePointer<Int8>?.self,
            capacity: Int(CommandLine.argc)
        )

    your_api_func(Int(CommandLine.argc), values)

Альтернативный: (в комментарии @MartinR) также протестировано и работает.

    CommandLine.unsafeArgv.withMemoryRebound(
            to: UnsafePointer<Int8>?.self, 
            capacity: Int(CommandLine.argc)) { ptr in
        your_api_func(Int(CommandLine.argc), ptr)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...