Как реализовать обратный вызов из функции C ++ в Swift - PullRequest
0 голосов
/ 28 августа 2018

Я пытался сделать что-то в классе cpp и при выполнении функции возвращать обратный вызов в swift.

Итак, я делаю эти вещи:

  1. Создание этой функции в callbackClass.cpp

    int callback::run(void (*callback)(int))
     {
         for (unsigned int i = 0; i < 100; i++)
         {
             callback(i);
         }
         return 0;
     }
    
  2. В callbackClass.hpp:

    class callbackClass.hpp
    {
      .
      .
      .
      public:
         int run(void (*callback)(int));
    };
    
    #endif
    
  3. А для header.h‍‍:

    int callback(void (*callback)(int));
    

Это хорошо до регистрации обратного вызова на Swift стороне:

func callbackFunc(){

  callback({valueFromCallback in //call cpp function

    print(valueFromCallback) //Works fine

  })
}

Но когда попробуйте заняться другими вещами, такими как:

func callbackFunc(){

  var value : String!

  callback({valueFromCallback in //call cpp function

    value = String(valueFromCallback) //It has a problem

  })
}

Xcode вернет эту ошибку:

Указатель на функцию C не может быть сформирован из замыкания, которое захватывает контекст

Я уже видел эти вопросы, но не помогло:

Swift: передача данных в замыкание, которое захватывает контекст

Как привести себя к UnsafeMutablePointer введите swift

Указатель на функцию C не может быть сформирован из замыкания, которое захватывает контекст

1 Ответ

0 голосов
/ 28 августа 2018

В конце концов я понял, что можно передать 'closure' в c ++ в качестве аргумента

Итак, сначала я создаю класс Closure в Swift:

typealias closureCallback = (Int32) -> ()

Затем передал его стороне cpp:

  1. В header.h‍‍

    int callback(void (^closureCallback)(int));
    
  2. В callbackClass.hpp:

    class callbackClass.hpp
    {
      .
      .
      .
    
      public:
          int run(void (^closureCallback)(int));
    };
    
    #endif
    
  3. А в callbackClass.cpp

    int callback::run(void (^closureCallback)(int))
     {
         for (unsigned int i = 0; i < 100; i++)
         {
             closureCallback(i);
         }
         return 0;
     }
    

Наконец обработайте его в Swift:

typealias closureCallback = (Int32) -> ()

func callbackFunc(){

  var value : String!

  let closureValue: closureCallback = {valueFromclosureCallback in
      value = String(valueFromclosureCallback)
   }

    callback(closureValue) //call cpp function

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...