带可变参数的Swift和C回调

带可变参数的Swift和C回调,c,swift,variadic-functions,C,Swift,Variadic Functions,我试图在Swift中使用一个C API,它要求我使用可变参数向函数传递回调,即: extern GEOSContextHandle_t GEOS_DLL initGEOS_r( GEOSMessageHandler notice_function, GEOSMessageHandler error_function); 其中,GEOSMessageHa

我试图在Swift中使用一个C API,它要求我使用可变参数向函数传递回调,即:

extern GEOSContextHandle_t GEOS_DLL initGEOS_r(
                                    GEOSMessageHandler notice_function,
                                    GEOSMessageHandler error_function);
其中,GEOSMessageHandler定义为:

typedef void (*GEOSMessageHandler)(const char *fmt, ...);
我该怎么处理?我尝试使用以下两种类方法实现Objective-C类:

@interface HumboldtCallback : NSObject
+(void)noticeCallback:(const char *)args, ... NS_REQUIRES_NIL_TERMINATION;
+(void)errorCallback:(const char *)args, ... NS_REQUIRES_NIL_TERMINATION;
@end
但是斯威夫特不让我接近他们。如果我将参数定义为
void*
,我可以从Swift访问它们:

var GEOS_HANDLE: COpaquePointer {
    let noticeCallbackPointer = HumboldtCallback.noticeCallback;
    let errorCallbackPointer = HumboldtCallback.errorCallback;
    return initGEOS_r(noticeCallbackPointer, errorCallbackPointer)
}
但编译器仍然不高兴:

Cannot invoke 'initGEOS_r' with an argument list of type '((UnsafeMutablePointer<Void>) -> Void, (UnsafeMutablePointer<Void>) -> Void)'
无法使用类型为“((UnsafeMutablePointer)->Void,(UnsafeMutablePointer)->Void)”的参数列表调用“initGEOS\u r”

在将回调函数作为参数传递给init函数之前,是否应该以某种方式将指针强制转换为回调函数

您需要编写一个C函数,而不是一个目标C方法。不幸的是,Swift会将这些转换为Swift关闭。但是,您可以在objective C中编写函数/方法来返回函数指针。这将使Swift无法将函数转换为闭包。i、 e在Objective标题中:

void myCallback (const char *fmt, ...);
GEOSContextHandle_t getMyCallback ();
然后在类中实现getMyCallback,如下所示:

GEOSContextHandle_t getMyCallback () {
  return myCallback;
}
并实现回调函数。在Swift中,您将得到:

initGEOS_r(getMyCallback(), ...)

我相信你可以用一个普通的C头和.C文件而不是使用一个对象来实现这一点。

如果你已经在Objective-C中创建了这个
HumboldtCallback
类,为什么不在这个类中创建一个调用
initGEOS\r
的方法呢?最后我直接实现了一个普通的C包装函数(initGEOSWrapper)这就叫initGEOS\u r。。但这仍然不能回答如何在Swiftugh中处理C变量函数参数的问题。谢谢你的回答!