Передать указатель 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, ...)