2017-03-27 6 views
1

エラーが表示されます。強制中 - 'MIDICompletionProc' (別名 '> ()@convention(C)(UnsafeMutablePointerを)')を入力する - '>()()'Swift 3でCoreMidi MIDISendSysexリクエストを作成するにはどうすればよいですか?

は、型の値を変換できません。

他のすべてのものは正常に見えますが、私の人生ではCompletionProc関数呼び出しを構成できないようです。

var mySysExSendRequest : MIDISysexSendRequest 
    let myCompProc = sysexCompletionProc (a separate static function) 

    mySysExSendRequest = MIDISysexSendRequest(destination: Dest, 
                data: dataptr, 
                bytesToSend: 16, 
                complete: complete, 
                reserved: res, 
                completionProc: sysexCompletionProc as MIDICompletionProc, 
                completionRefCon: nil) 

    MIDISendSysex(&mySysExSendRequest) 
+0

実際の 'sysexCompletionProc'の宣言を表示してください。 – Alnitak

+0

こんにちは@Alnitak、この段階ではちょうどスタブ。 >ボイド{( "MyMIDICompletionProcにおいて") \t \tプリント – Jon

答えて

1

現在、引数を取らない関数、つまり() -> Voidを指定しています。

あなたの完了procがこの署名を持っている必要があります。

(UnsafeMutablePointer<MIDISysexSendRequest>) -> Void 

はまた、procが@convention(c)セマンティクスと互換性がある必要があるため、それはクラスメソッドまたは閉鎖することはできません。

completionRefConフィールドにselfへのポインターを渡してコールバック内で「安全でない」メソッドを使用してキャストすることで、この制限を回避することができます。

+0

\t}おかげ@Alnitak - MyMIDICompletionProc()FUNC静的 。 MIDISysexSendRequestは、それ自身のパラメータとしてポインタを必要とします。 mySysExSendRequestを初期化する前に、そのポインタを取得するにはどうすればよいですか?私は初期化できるようにポインタが必要なので、鶏と卵のように見えますか? – Jon

+0

@ジョンhmm、良い点。値に 'nil'を使用してオブジェクトを構築し、' req.completionRefCon = UnsafeMutableRawPointer(&req) 'を再割り当てすることは可能ですが、そのポインタはその存続期間にわたって安定していることが保証されていません: – Alnitak

関連する問題