如何在Swift中调用c TIFFGetField函数?

时间:2016-08-13 05:10:17

标签: swift

如何在swift中调用c函数“TIFFGetField” 有没有人有想法或给我样品?感谢

//The function declared
extern int TIFFGetField(TIFF* tif, uint32 tag, ...);

/* sample: in objective-c is working very well */
unsigned int width;
TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width);

/* sample: in swift failed */
var width: UInt32 = 0
TIFFGetField(tiff, uint32(TIFFTAG_IMAGEWIDTH), &width)

/* error message: 
 * 'TIFFGetField' is unavailable: Variadic function is unavailable
 */

1 个答案:

答案 0 :(得分:1)

如我的评论所述,Swift中没有基于C的可变参数函数。在您的情况下,一个很好的选择是使用TIFFVGetField

只要看到函数签名和man文档,您可能需要编写如下内容:

(请参阅更新。)

var width: UInt32 = 0
withUnsafeMutablePointer(&width) {widthPtr in
    let args: [CVarArgType] = [widthPtr]
    TIFFVGetField(tiff, UInt32(TIFFTAG_IMAGEWIDTH), getVaList(args))
}

(更新)抱歉,我一直在想苹果公司说应该避免这个功能getVaList。建议使用withVaList,上面的代码可以改写为:

var width: UInt32 = 0
withUnsafeMutablePointer(&width) {widthPtr in
    withVaList([widthPtr]) {vaListPtr in
        TIFFVGetField(tiff, UInt32(TIFFTAG_IMAGEWIDTH), vaListPtr)
    }
}

(谢谢,Martin R。)

请尝试。