Передать указатель FILE* из Swift в функцию C

Я использую libxml в своем проекте iOS Swift. Для отладки мне нужно вызвать следующую функцию C из Swift:

void xmlDebugDumpString (FILE * output, const xmlChar * r)

Тем не менее, я не знаю, как создать FILE * output указатель в Swift.

Я попробовал следующий код:

let debugDoc: UnsafeMutablePointer<FILE>
debugDoc = fopen(debugDocURL.absoluteString, "w")
xmlDebugDumpNode(debugDoc, str)

Код скомпилирован нормально, но выдает следующую ошибку во время выполнения

Поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

1 ответ

Решение

Проблема заключается в неправильном использовании absoluteString, чтобы fopen()не удается и возвращается nil, Правильный способ создать строку C из URL withUnsafeFileSystemRepresentation:

guard let debugFile = debugDocURL.withUnsafeFileSystemRepresentation( { fopen($0, "w") }) else {
    // Could not open file ...
}

Теперь вы можете написать в файл

xmlDebugDumpNode(debugFile, ...)

и в конце концов закройте его:

fclose(debugFile)

Альтернативный вариант - выгрузить выходные данные отладки в (предопределенный) файл "стандартной ошибки":

xmlDebugDumpNode(stderr, ...)
Другие вопросы по тегам