【问题标题】:how implement callback from C++ function to Swift如何实现从 C++ 函数到 Swift 的回调
【发布时间】:2018-08-28 18:44:59
【问题描述】:

我尝试在 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: Pass data to a closure that captures context

How to cast self to UnsafeMutablePointer<Void> type in swift

A C function pointer cannot be formed from a closure that captures context

【问题讨论】:

    标签: c++ ios swift callback


    【解决方案1】:

    最终我意识到可以将“闭包”作为参数传递给 c++

    所以一开始我在 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
    
    }
    

    【讨论】:

    • 这解决了我几天来一直在努力解决的问题,而且非常简单。谢谢!
    • @DavidSpry Yw,如果您发现答案正确,您可以投票给答案而不是感谢它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多