我需要调用一个C ++方法并将一个回调方法作为参数...来自ObjectiveC方法...... 然后在ObjectiveC中多次触发这个回调方法...因为它是一个回调...所以我需要捕获该ObjectiveC回调方法,因为它将被称为Swift代码的闭包...
这是C ++方法签名
static bool cPlusPlusMethodWithCallBack(const std::string& someText, void (*someCallback)(unsigned int) = NULL, unsigned int someNum = 0);
我的问题是在ObjectiveC中声明的这个回调方法的Block语法(在.mm和.h中),然后可以作为参数传递给C ++中的someCallback
我是一名Swift开发人员,所以有点困在ObjectiveC上...非常感谢
答案 0 :(得分:5)
您不能将Objective-C块(或Swift闭包)作为函数指针参数传递。您需要创建一个单独的独立函数,并将其作为回调传递。
void MyCallback(unsigned int value)
{
// ...do something...
}
在您的主要代码中:
cPlusPlusMethodWithCallBack("something", MyCallback);
现在,这样做的缺点是,在回调中,您通常需要引用特定的Objective-C对象才能正确处理回调。如果您需要使用此特定回调,则需要将其作为静态变量保存在某处,以便可以从MyCallback
函数访问它。
或者,如果您可以控制cPlusPlusMethodWithCallBack
源代码,则可以更新它以获取void *
“reference”参数,然后在调用回调时将该参数作为参数提供:
static void cPlusPlusMethodWithCallback(void (*callback)(void *ref), void *ref)
{
// ...really time consuming processing...
callback(ref);
}
然后,更新您的回调函数:
void MyCallback(void *ref)
{
ObjectiveCObject *obj = (ObjectiveCObject *)ref;
[obj doSomething];
}
当您最初调用该方法时,只需传入您需要的对象作为参考参数:
cPlusPlusMethodWithCallback(MyCallback, myObjectiveCObject);