2016-10-30 21 views
2

Swift 3を使用してCライブラリ用のラッパー/インターフェイスを構築しています。私が呼び出す必要がある関数の1つに、引数としてのコールバック。具体的にはコールバック関数ポインタを引数として持つSwift 3のC API関数の使用

は: - 基本的に私は言ったデータ

機能のルックスで他の操作を行うせた後、機能が正常にそれが、それはその後、与えられた引数のポインタが参照する関数を呼び出しているファイル操作を行っていると述べましたこのように次のよう

HSYNC MXDEF (Syncer)(DWORD h, DWORD t, QWORD p, SYNCPROC *proc, void *user);

コールバック関数型SYNCPROCが定義される:

typedef void (CALLBACK SYNCPROC)(HSYNC h, DWORD c, DWORD d, void *user);

私は今のところ皆無にコールバック引数を設定するとSyncer機能を利用することができました。

誰かが示唆したように、私はクラスの外側の関数を作成してみました:

func callbackCalled(handle: HSYNC, channel: DWORD, data: DWORD, user: UnsafeMutableRawPointer) -> Void { print("callback called") }

をそして私も、クラス内でこの方法を試みた:

var callbackTest : @convention(c) (_ handle: HSYNC, _ channel: DWORD, _ data: DWORD, _ user: UnsafeMutableRawPointer) -> Void = { print("\($0) \($1) \($2) \($3)") }

をしかし、私は/読み取りを試してみましたがこのトピックで私はいつもこのエラーメッセージで終わる:

Cannot convert value of type 'Void' (aka '()') to expected argument type '(@convention(c) (HSYNC, DWORD, DWORD, UnsafeMutableRawPointer?) -> Void)!'

私の質問はこのタイプのコールバック関数に関する基準をどのように満たす必要がありますか?

私はこの種のコールバック関数に関する情報を見つけることができませんでした。おそらく、私の知識の欠如と問題の完全な理解のためです。前もって感謝します!

答えて

2

コールバックが動作するはずのようにグローバル関数を渡すが、最後のパラメータ はオプションUnsafeMutableRawPointer?にする必要があります(とコンパイラは、パラメータの 種類を推測しましょう)また

func callbackCalled(handle: HSYNC, channel: DWORD, data: DWORD, user: UnsafeMutableRawPointer?) -> Void { 
    print("callback called") 
} 

Syncer(h, c, d, callbackCalled, u) 

、閉鎖式を渡します。あなたはを比較、コールバックとしてインスタンス方法を渡すことはできません

Syncer(h, d, c, { 
    (handle, channel, data, user) in 
    // ... 
}, u) 

How to use instance method as callback for function which takes only func or literal closure

NULLは、ユーザーパラメータの有効な値ではない場合、あなたは 例えば、C宣言に "Nullability annotations"を追加することができます

typedef void (CALLBACK SYNCPROC)(HSYNC h, DWORD c, DWORD d, void * _Nonnull user); 

と、それはスウィフト非オプションUnsafeMutableRawPointerとして表されます。

+0

すばらしく素早いヘルプをいただきありがとうございます。私は構文を混乱させました - 今は完全に動作します。 – drummingdemon

関連する問題