Быстрый указатель на указатель на параметр const char

При взаимодействии с C api (SQLite 3 C api) из Swift мне нужно передать указатель на указатель на const char в качестве выходного параметра:

sqlite3_prepare_v2(
// snip other parameters
const char **pzTail // OUT parameter
);

Который переводится в Swift как:

sqlite3_prepare_v2(
// snip other parameters
UnsafeMutablePointer<UnsafePointer<Int8>>
)

Этот выходной параметр хочет быть пригодным для использования в виде строки. Вы можете пройти Swift String к const char * легко, но я не понимаю, как получить что-то полезное от двойной косвенности.

Кто-нибудь может пролить немного света здесь?

1 ответ

Решение

Мне было весело играть с этим. Я не касался ничего из C-Swift раньше

Вот чего я добился на детской площадке. Надеюсь, это поможет вам:)

Изменить: я сделал лучшую чистую версию Swift

// Function to convert your type - UnsafeMutablePointer<UnsafePointer<Int8>>
func stringFromYourType(cStringPointer: UnsafeMutablePointer<UnsafePointer<Int8>>) -> String? {
    guard let string = String.fromCString(cStringPointer.memory) else { return nil }
    return string
}

// Create your type
let swiftString = "I'm a swift string"
var pointer = swiftString.nulTerminatedUTF8.withUnsafeBufferPointer { UnsafePointer<Int8>($0.baseAddress) }

// Convert it back
var newSwiftString = stringFromYourType(&pointer) // &pointer is equivalent to (char **)
Другие вопросы по тегам