Передать указатель 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: Неустранимая ошибка: неожиданно найдено nil при развертывании необязательного значения


person B.L.    schedule 18.08.2018    source источник


Ответы (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, ...)
person Martin R    schedule 18.08.2018