将FILE *指针从Swift传递给C函数

时间:2018-08-18 17:07:31

标签: c swift file-pointer

我在我的iOS Swift项目中使用libxml。要调试,我需要从Swift调用以下C函数:

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

但是,我不知道如何在Swift中创建FILE * output指针。

我尝试了以下代码:

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

代码可以正常编译,但是会出现以下运行时错误

  

线程1:致命错误:在展开可选值时意外发现nil

1 个答案:

答案 0 :(得分:1)

问题是absoluteString的使用错误,因此fopen() 失败并返回nil。从URL创建C字符串的正确方法是withUnsafeFileSystemRepresentation

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

现在您可以写入文件了

xmlDebugDumpNode(debugFile, ...)

并最终将其关闭:

fclose(debugFile)

另一种选择是将调试输出转储到(预定义) “标准错误”文件:

xmlDebugDumpNode(stderr, ...)