2017-01-23 18 views
2

私はC++メソッドを呼び出し、コールバックメソッドをパラメータとして渡す必要があります... ObjectiveCメソッドから... このコールバックメソッドは、ObjectiveCで複数回トリガされます。 ...それは、コールバックだ...ので、私はObjectiveCのコールバックメソッドという罠に必要戻って、それはスウィフトコードからクロージャと呼ばれるほどの...ObjectiveCからのコールバックでC++メソッドを呼び出す

これは

static bool cPlusPlusMethodWithCallBack(const std::string& someText, void (*someCallback)(unsigned int) = NULL, unsigned int someNum = 0); 
C++メソッドシグネチャであります

私の質問は、私が宣言したこのコールバックメソッドのブロック構文にする必要がありますnは、その後CでこのsomeCallback ++

私はそうObjectiveCに引っかかっビットスウィフト開発者ですへのパラメータとして渡すことができます(.mmと.H中)ObjectiveC ...多くのおかげ

答えて

2

あなたがすることはできませんそのような関数ポインタの引数として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); 
関連する問題