Мне нужно вызвать метод C ++ и передать в Перезвоните метод в качестве параметра … из метода ObjectiveC …
Этот метод обратного вызова затем запускается несколько раз в ObjectiveC … так как это обратный вызов … и поэтому мне нужно перехватить этот метод обратного вызова ObjectiveC, поскольку он будет вызываться как замыкание из кода Swift …
Это подпись метода C ++
static bool cPlusPlusMethodWithCallBack(const std::string& someText, void (*someCallback)(unsigned int) = NULL, unsigned int someNum = 0);
Мой вопрос заключается в том, каким должен быть синтаксис Block этого метода обратного вызова, объявленного в ObjectiveC (в .mm и .h), который затем может быть передан в качестве параметра этому someCallback в C ++.
Я разработчик Swift, поэтому немного застрял на ObjectiveC … Большое спасибо
Вы не можете передать блок Objective-C (или замыкание Swift) в качестве аргумента указателя функции, подобного этому. Вам нужно будет создать отдельную автономную функцию и передать ее в качестве обратного вызова.
void MyCallback(unsigned int value)
{
// ...do something...
}
И в вашем основном коде:
cPlusPlusMethodWithCallBack("something", MyCallback);
Недостатком этого является то, что в вашем обратном вызове вам часто нужно ссылаться на конкретный объект Objective-C для правильной обработки обратного вызова. Если это то, что вам нужно с этим конкретным обратным вызовом, вам нужно сохранить его где-то как статическую переменную, чтобы к нему можно было получить доступ из MyCallback
функция.
В качестве альтернативы, если у вас есть контроль над cPlusPlusMethodWithCallBack
Исходный код, вы можете обновить его, чтобы взять void *
«ссылочный» параметр, а затем предоставить этот параметр в качестве аргумента при вызове обратного вызова:
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);
Других решений пока нет …