2016-08-25 11 views
2

swift-codeからC++コードにコールバック関数を渡そうとしています。現在のバージョンのXcodeを使用しています。それは、これまでの機能に単純な変数のために動作しますが、ない:コールバック関数をswiftからC++に適切に渡すにはどうすればよいですか?

CPP-class.cpp:

bool * swiftvar; 

void register_var(bool * varpntr){ 
    swiftvar = varpntr; 
    cout<<"registered"<<endl; 
} 

void switch_var(){ 
    *swiftvar = !(*swiftvar); 
    cout<<"switched"<<endl; 
} 

CPP-class.hpp:

#ifdef __cplusplus 
extern "C"{ 
#endif 

    void register_var(bool *); 
    void switch_var(); 

#ifdef __cplusplus 
} 
#endif 

と迅速で:

register_var(&testbool) 
print(testbool) 
switch_var() 
print(testbool) 

私が(私が知っている限り、現行の迅速版では簡単なはずです)同じものを試してみると、エラーが出ます。だから私はどのように迅速に関数ポインタを渡す必要がありますか?私が見つけたすべての方法はエラーを引き起こしていました。私が読んでいるように、UnsafeMutablePointerオブジェクトを定義する古い方法は廃止されましたが、現在どのように機能していますか?私は期待して何かのように:

CPP-class.cpp:

void run_func(void * funcpntr()){ 
    (*funcpntr)(); 
} 

CPP-class.hpp:

void run_func(void *); 

(SWIFT-擬似コード):

run_func(testfunc()) 

または、ラップされたcppコードからswift-functionを実行するためのより良いソリューションがありますか?

本当にありがとうございます。署名は、すべての

void run_func(void (*)()); // Declaration 

// Definition 
void run_func(void (*funcpntr)()) { 
    (*funcpntr)(); 
} 

と利用

void testfunc(); 
run_func(&testfunc); 
+0

コールバックのどの部分が誤植で、どの部分が本物のエラーであるかを知ることは非常に難しいです。コピーして貼り付けましたか? – molbdnilo

答えて

1

まずだろう事前

+0

'.hpp'の必要はありません。関数の宣言をブリッジヘッダに追加することができます。 '.cpp'ファイルにおいても、' test_run'は 'extern" C "'の中に埋め込まれている必要があります。そうしないと、名前のマングリングは互換性のあるシンボルを生成しません。 – Cristik

+0

ありがとう、私は異なる例を混ぜて、上記の正しいtypedefを台無しにしました。トップレベルの機能でなければならないので、例えばViewControllerクラスのテキストフィールドのstringvalueを変更する機会はありますか? – archimedes

+0

@archimedes、toplevel-functionsはグローバル変数にアクセスできますが、わかっているように、グローバル変数を使うのは危険です。私はcpp関数のシグネチャを変更して、Stringを取る別のパラメータを追加して(それは 'char *'とすることができます)、cpp側のコールバックに渡します。しかし、cpp側を変更できない場合は、グローバル変数を細心の注意を払って使用する必要があります。 – OOPer

0

におかげで、あなたは.CPP/.HPPで正しく機能型を宣言する必要があります。

た.cpp:

void run_func(void (* funcpntr)()) { 
    (*funcpntr)(); 
} 

.HPP:

void run_func(void (* funcpntr)()); 

(Jarod42の答えに示すように、あなたは後者funcpntrを省略することができ、これが最初に示されているようextern "C" {...}で囲む必要があります。 "cpp-class.hpp:")

そしてスウィフト側:

関数定義:

//This needs to be a toplevel function, which means it cannot be a method. 
func test_func() { 
    //... 
} 

run_func()に渡す:

run_func(test_func) 

それともrun_funcにクロージャを渡すことができます。

//This closure cannot have captured variables. 
    run_func { 
     //... 
    } 
関連する問題